Verarbeitung großer Dateien in Java

8

Ich habe eine riesige Datei von etwa 10 GB. Ich muss Operationen wie Sortieren, Filtern usw. für die Dateien in Java ausführen. Jede Operation kann parallel durchgeführt werden.

Ist es gut, 10 Threads zu starten und die Datei parallel zu lesen? Jeder Thread liest 1 GB der Datei. Gibt es eine andere Möglichkeit, das Problem mit extra großen Dateien zu lösen und sie so schnell wie möglich zu verarbeiten? Ist NIO für solche Szenarien geeignet?

Momentan führe ich Operationen seriell durch und es dauert ungefähr 20 Minuten, um solche Dateien zu verarbeiten.

Danke,

    
jumpa 14.03.2012, 20:28
quelle

2 Antworten

11
  

Ist es gut, 10 Threads zu starten und die Datei parallel zu lesen?

Fast sicher nicht - obwohl es abhängt. Wenn es von einer SSD kommt (wo es effektiv keine Suchzeit gibt), dann vielleicht . Wenn es eine herkömmliche Festplatte ist, definitiv nicht.

Das heißt nicht, dass Sie nicht mehrere Threads verwenden können - Sie könnten möglicherweise einen -Thread erstellen, um die Datei zu lesen, und nur die rudimentärsten Aufgaben ausführen, um die Daten in verarbeitbare Abschnitte zu bringen. Verwenden Sie dann eine Producer / Consumer-Warteschlange, um mehrere Threads die Daten verarbeiten zu lassen.

Ohne mehr zu wissen als "sort, filter, etc" (was ziemlich vage ist), können wir nicht wirklich sagen, wie parallelisierbar der Prozess ist - aber der Versuch, das IO parallel in einer einzigen Datei auszuführen, wird < em> wahrscheinlich nicht helfen.

    
Jon Skeet 14.03.2012, 20:31
quelle
1

Probieren Sie den Code aus, um zu sehen, wo die Engpässe liegen. Haben Sie versucht, einen Thread die ganze Datei (oder so viel wie möglich) lesen zu lassen und diese an 10 Threads für die Verarbeitung weiterzugeben? Wenn File I / O Ihr Engpass ist (was plausibel erscheint), sollte dies die Gesamtlaufzeit verbessern.

    
Oleksi 14.03.2012 20:31
quelle

Tags und Links