Effizienter Umgang mit großen Dateien

  • Themenstarter Themenstarter java.newbie
  • Beginndatum Beginndatum
J

java.newbie

Gast
Hallo,

könnte ihr mir sagen, wie ich möglichst effizient irgendwelche Operationen Byte-weise auf eine sehr große Datei (in GB-Größe) anwenden kann?
Um nicht die gesamte Datei in den Speicher laden zu müssen, würde sich wohl der wahlfreie Zugriff mittels RandomAccessFile anbieten, oder? Aber wie bekomme ich eine möglichst hohe Performance? Danke!
 
Hi,

schau dir mal in der Java-API-Doc mal das Package "java.nio" an (vielleicht "MappedByteBuffer"). Das
enthält neue Klassen für den Umgang mit Dateien.
 
Im einfachsten Fall bzw. grundsätzlich, wenn es geht, streamt man. Das schafft man schon mit den Klassen in java.io. 😉 (java.nio ist aber auch nicht schlecht.)

Ark
 
danke schon mal für eure Antworten. Ich hätte aber noch Fragen dazu:
1.) Welche Möglichkeit ist denn performanter? MappedByteBuffer oder Streaming?
2.) Hinsichtlich des Aufwands und des Anspruchs dürften beide Varianten ähnlich sein, richtig?
3.) Wie schneided dahingegen meine Idee mit dem wahlfreien Zugriff mittels RandomAccessFile ab?

4.) Über welche Größenordnung reden wir hier überhaupt, wenn man mit einer der genannten Varianten - was weiß ich - zB für jedes Byte einer 1GB großen Datei je eine XOR-Operation durchführen wollte?
 
danke schon mal für eure Antworten. Ich hätte aber noch Fragen dazu:
1.) Welche Möglichkeit ist denn performanter? MappedByteBuffer oder Streaming?
2.) Hinsichtlich des Aufwands und des Anspruchs dürften beide Varianten ähnlich sein, richtig?
3.) Wie schneided dahingegen meine Idee mit dem wahlfreien Zugriff mittels RandomAccessFile ab?

4.) Über welche Größenordnung reden wir hier überhaupt, wenn man mit einer der genannten Varianten - was weiß ich - zB für jedes Byte einer 1GB großen Datei je eine XOR-Operation durchführen wollte?
zu 1.) Das kommt darauf an, wie viel Arbeitsspeicher du hast und wie groß die Dateien sind. Wenn es eher viele kleine Dateien sind, würde ich sie ganz klassisch mit java.io verarbeiten. Wenn du aber eher große Dateien und viel Arbeitsspeicher frei(!) hast, kann sich das Mapping lohnen.
zu 2.) Siehe 1.)
zu 3.) Das kommt darauf an, was du machen willst. Wenn du z.B. jedes Byte unabhängig vom anderen bearbeiten kannst, kannst/musst du anders vorgehen, als wenn du Abhängigkeiten beachten musst. Generell ist RandomAccessFile aber eher dazu gedacht, verschiedene Bytes an noch unbekannten Orten zu verarbeiten (also vor allem zu ändern). Wenn du aber sowieso die ganze Datei (von Anfang bis Ende) verarbeiten musst, lohnt sich RandomAccessFile üblicherweise nicht.
zu 4.) Siehe 3.) Die Laufzeit einer bloßen XOR-Verknüpfung liegt bei O(n), komplexere Operationen können aber mehr beanspruchen. Da müsstest du schon mit dem genauer werden, was du vorhast. Aber ich denke nicht, dass sich groß irgendetwas ändern wird.

Ark
 
Die Datei möchte ich _nicht_ in einem Durchlauf bearbeiten. Im Konkreten möchte ich im Prinzip eine große Datei (~1-4GB) in sehr vielen einzelnen - also in sehr kleinen - und unabhängigen Blöcken betrachten und diese Blöcke jeweils byteweise bearbeiten. Das heißt, ich möchte zwar die gesamte Datei einlesen, würde dabei allerdings auch sehr stark innerhalb der Datei wandern.

Sehe ich es richtig, dass bei diesen Anforderungen der wahlfreie Zugriff mittels RandomAccessFile die schnellste Zugriffszeit bietet und somit das Mittel der Wahl darstellt?
 
Für mich hört sich das stark nach einem Idealfall für MappedByteBuffer an, aber eine definitive Aussage dazu, ob das nun "besser" ist als ein anderes Verfahren kann ich leider nicht machen.
 

Zurück
Oben