Frage

Also ich habe eine „große“ Anzahl von „sehr großen“ ASCII-Dateien von numerischen Daten (Gigabyte insgesamt), und mein Programm muß die Gesamtheit davon nacheinander mindestens einmal verarbeiten.

Jede Beratung über die Speicherung / Laden der Daten? Ich habe gedacht, die Dateien in binärer Umwandlung ihnen kleine und für schnelleren Laden zu machen.

Soll ich alles in den Speicher laden alle auf einmal?
Wenn nicht, öffnet, was ein guter Weg ist teilweise die Daten des Ladens?
Was sind einige Java-relevanten Effizienz-Tipps?

War es hilfreich?

Lösung

  

Also was ist dann, wenn die Verarbeitung der Daten für mehrere Dateien und mehrere Puffer herumspringen erfordert? Sind ständiges Öffnen und Schließen von Binärdateien werden teuer werden?

Ich bin ein großer Fan von 'Memory Mapped I / O' , auch bekannt als 'direkte Byte-Puffer' . In Java sind sie Mapped Byte Puffer genannt ist Teil java.nio. (Im Grunde dieser Mechanismus verwendet die virtuelle Speicher-Paging-System OS auf ‚Karte‘ Ihre Dateien und präsentieren sie programmatisch als Byte-Puffer. Die OS verwalten werden die Bytes zu / von Festplatten- und Speicher auto-magisch und sehr schnell zu bewegen.

Ich schlage vor, diesen Ansatz, weil a) es funktioniert für mich, und b) es werden Sie auf Ihrem Algorithmus konzentrieren und die JVM, Betriebssystem und Hardware-Geschäft mit der Performance-Optimierung lassen. Alle häufig, sie wissen, was am besten ist mehr so, als wir demütig Programmierer. ;)

Wie würden Sie MBBs in Ihrem Kontext verwenden? Erstellen Sie einfach einen MBB für jede Ihrer Dateien und lesen Sie, wie Sie für richtig halten. Sie werden nur Ihre Ergebnisse speichern müssen. .

BTW: Wie viele Daten beschäftigen Sie mit, in GB? Wenn es mehr als 3-4GB ist, dann wird dies nicht für Sie arbeitet auf einer 32-Bit-Maschinen wie die MBB-Implementierung ist Beklagt auf dem adressierbaren Speicherraum durch die Plattform-Architektur. Eine 64-Bit-Maschine & OS werden Sie zu 1 TB oder 128TB von mappable Daten übernehmen.

Wenn Sie über Leistung denken, dann wissen Kirk Pepperdine er mit einer Website beteiligt ist, www.JavaPerformanceTuning.com, die einige weitere Details MBB hat (eine etwas berühmte Java-Performance-Guru.): NIO Performance-Tipps und andere Java-Performance bezogene Dinge.

Andere Tipps

Sie können einen Blick auf die Einträge in der Weit Finder Project (eine google-Suche nach " wide-Finder“java ).

Die Weit Finder beinhaltet über viele Linien in Log-Dateien zu lesen, so betrachten Sie die Java-Implementierungen und sehen, was funktioniert und nicht funktioniert es.

Sie könnten, um binäre, zu konvertieren, aber dann haben Sie 1+ etwas Kopien der Daten, wenn Sie das Original um zu halten brauchen.

Es kann praktisch sein, eine Art von Index auf Ihren ursprünglichen ascii Daten zu bauen, so dass, wenn Sie durch die Daten gehen müssen wieder können Sie es schneller in der Folgezeit.

Um Ihre Fragen zu beantworten, um:

  

Soll ich alles in den Speicher auf einmal laden?

Nicht, wenn nicht müssen. für einige Dateien, können Sie in der Lage sein, aber wenn Sie nur sequentiell verarbeiten, tun nur eine Art von durch die Dinge, die man von einer lesen gepufferte, speichern, was Sie benötigen auf dem Weg.

  

Wenn nicht, öffnet, was ein guter Weg ist teilweise die Daten des Ladens?

BufferedReaders / etc ist am einfachsten, wenn auch Sie tiefer in Filechannel / etc aussehen könnten, um I / O memorymapped verwendet durch die Fenster der Daten zu einer Zeit, zu gehen.

  

Was sind einige Java-relevanten Effizienz-Tipps?

Das hängt wirklich davon ab, was Sie mit den Daten selbst tun!

Ohne zusätzliche Einblicke in welche Art von Verarbeitung vor sich geht, sind hier einige allgemeine Gedanken aus, wenn ich haben ähnliche Arbeit geleistet.

  1. einen Prototyp der Anwendung schreiben (vielleicht sogar „ein wegzuwerfen“), die eine beliebige Operation auf dem Datensatz durchführt. Sehen Sie, wie schnell es geht. Wenn die einfachste, naiv, was man denken kann, ist in akzeptabler Weise schnell, keine Sorgen!

  2. Wenn der naive Ansatz nicht funktioniert, sollten Sie die Vorverarbeitung der Daten, so dass nachfolgende Läufe in einer akzeptablen Zeitspanne ausgeführt wird. Sie erwähnen, die in den Daten ziemlich viel auf „herumspringen“. Gibt es eine Möglichkeit zu-Verfahren vor, das aus? Indexdaten - - Oder ein Vorverarbeitungsschritt kann noch mehr Daten zu erzeugen, die Byte-genauen Standortinformationen über kritischen, notwendigen Abschnitt des Datensatz zur Verfügung stellt. Dann können Sie Ihre Hauptverarbeitung läuft diese Informationen nutzen, direkt zu den benötigten Daten zu springen.

Also, um zusammenzufassen, dann wäre mein Ansatz etwas einfach jetzt versuchen und sehen, was die Leistung aussieht. Vielleicht wird es in Ordnung sein. Ansonsten schauen Sie in die Daten in mehreren Schritten der Verarbeitung, die teuersten Operationen für seltene Vorverarbeitung zu speichern.

Sie nicht „alles in den Speicher geladen werden“. Führen Sie einfach Dateizugriffe und lassen Sie die Disk-Seiten-Cache des Betriebssystems entscheiden, wann Sie kommen, um tatsächlich die Dinge ziehen direkt aus dem Speicher.

Das hängt viel von den Daten in der Datei. Big Großrechner haben für eine lange Zeit sequentielle Datenverarbeitung wurden zu tun, aber sie normalerweise nicht mit wahlfreiem Zugriff für die Daten verwenden. Sie ziehen es gerade in einer Linie zu einer Zeit und Prozess, der viel, bevor Sie fortfahren.

Für Direktzugriff ist es oft am besten Objekte mit Caching-Wrapper zu bauen, die wissen, wo in der Datei die Daten, die sie benötigen, ist zu konstruieren. Bei Bedarf lesen sie diese Daten in und selbst konstruieren. Auf diese Weise, wenn der Speicher knapp ist können Sie einfach Sachen beginnen zu töten, ohne zu viele Sorgen um später nicht in der Lage, es wieder zu bekommen.

Sie haben wirklich nicht, uns genug Informationen gegeben, Ihnen zu helfen. Sie benötigen jede Datei in seiner entiretly zu laden, um sie zu verarbeiten? Oder können Sie verarbeiten es Zeile für Zeile?

eine ganze Datei Laden zu einem Zeitpunkt wahrscheinlich zu einer schlechten Leistung führt auch für Dateien, die nicht sehr groß sind. Ihre beste Wette ist eine Puffergröße zu definieren, die für Sie arbeitet und Lese / Schreib-Prozess die Daten einen Puffer zu einem Zeitpunkt.

Ich habe festgestellt Informatica ein außerordentlich nützliches Datenverarbeitungswerkzeug sein. Die gute Nachricht ist, dass die neueren Versionen auch Java-Transformationen erlauben. Wenn Sie mit Terabytes von Daten zu tun hat, könnte es Zeit Pony bis zu den Best-of-Breed-ETL-Tool sein.

Ich nehme an, Sie etwas mit den Ergebnissen der Verarbeitung hier tun wollen, wie Speicher, um ihn irgendwo.

Wenn Sie Ihre numerischen Daten regelmäßig abgetastet wird, und Sie müssen mit wahlfreiem Zugriff zu tun, halten sie in einem Quadtree .

Ich empfehle Reguläre Ausdrücke stark nutzen und Blick in das „neue“ IO nio-Paket für eine schnellere Eingabe. Dann sollte es gehen, so schnell wie Sie realistisch Gigabytes von Daten erwarten können, gehen.

Wenn möglich, die Daten in eine Datenbank erhalten. Dann können Sie alle Indizierung nutzen, Caching, Speicher-Pinning und andere Funktionen für Sie da.

Wenn Sie die Daten mehr als einmal zugreifen müssen, laden Sie sie in einer Datenbank. Die meisten Datenbanken haben eine Art von Bulkbeladung Dienstprogramm. Wenn die Daten alle in den Speicher passen, und Sie brauchen nicht zu halten, um oder auf sie zugreifen, die oft, werden Sie wahrscheinlich etwas einfach in Perl oder Ihre bevorzugten Skriptsprache schreiben können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top