Effizienter Umgang mit großen Dateien

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!
 
G

gman

Gast
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.
 

Ark

Top Contributor
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
 
J

java.newbie

Gast
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?
 

Ark

Top Contributor
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
 
J

java.newbie

Gast
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?
 

Marco13

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Programm effizienter gestalten Java Basics - Anfänger-Themen 17
A Algorithmus effizienter machen Java Basics - Anfänger-Themen 1
A Wie kann ich mein Programm noch effizienter machen? Java Basics - Anfänger-Themen 1
M Effizienter Variablen außerhalb einer Schleife zu deklarieren? Java Basics - Anfänger-Themen 1
G Geht das effizienter?: Einlesen > Duplikate entf > Spe Java Basics - Anfänger-Themen 13
A Welche dieser Schleifen im TableCellRendererist effizienter? Java Basics - Anfänger-Themen 18
W Umgang mit Graphics unklar : Erstellung u Uebergabe an Funktion Java Basics - Anfänger-Themen 18
M Umgang mit dem Type "Date" Java Basics - Anfänger-Themen 6
julian112 Input/Output .gz bzw. .txt Datei Einlesen und Umgang mit Exceptions Java Basics - Anfänger-Themen 1
X Probleme im Umgang mit PriorityQueue Java Basics - Anfänger-Themen 75
O Umgang mit Vererbung verstehen Java Basics - Anfänger-Themen 4
N Umgang mit Domain Framework Java Basics - Anfänger-Themen 2
J Umgang mit System.out.println() und .print() Java Basics - Anfänger-Themen 6
F Umgang mit referenzierten Objekten bei ArrayList Java Basics - Anfänger-Themen 1
C Hilfe für Kommentar-Zapper gesucht / Umgang mit Console Java Basics - Anfänger-Themen 0
M Umgang mit Thread/ Synchronisation/ Deadlock-Vermeidung Java Basics - Anfänger-Themen 5
J Umgang mit großen Datenmengen Java Basics - Anfänger-Themen 9
B Hilfe mit dem umgang von vererbung Java Basics - Anfänger-Themen 3
G Erste Schritte Fragen zum Umgang mit CSV Java Basics - Anfänger-Themen 2
M Verständnisfrage im Umgang mit Map Java Basics - Anfänger-Themen 10
I Umgang mit ByteBuffer Java Basics - Anfänger-Themen 11
I [Java] Umgang mit abstrakten Klassen, Interfaceklassen (BSP) Java Basics - Anfänger-Themen 12
M Der Umgang mit Iterator - Wie ein Objekt aus einer ArrayList Java Basics - Anfänger-Themen 2
J Umgang mit klassen ? Java Basics - Anfänger-Themen 3
J Umgang mit SQL Connections Java Basics - Anfänger-Themen 3
C Umgang mit Dateien Java Basics - Anfänger-Themen 4
G Umgang mit CSV-Dateien Java Basics - Anfänger-Themen 17
ixChronos Letzten 4 Ziffern einer großen Zahl ausgeben Java Basics - Anfänger-Themen 3
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
kilopack15 Rechnen mit großen Zahlen Java Basics - Anfänger-Themen 6
C Verarbeitung von sehr großen Dateien Java Basics - Anfänger-Themen 52
P Variablen Negatives Ergebnis bei Multiplikation von großen Zahlen Java Basics - Anfänger-Themen 2
S Multiplikation von großen Zahlen, ohne BigInt uä Java Basics - Anfänger-Themen 7
C Problem mit Lesen und Speichern und Verarbeiten von großen Text Dateien Java Basics - Anfänger-Themen 5
MilchToast Teilstrings aus unbekannt großen Textdateien extrahieren. Java Basics - Anfänger-Themen 5
I Kann nicht compilieren warum? Bei großen Quellcode. Java Basics - Anfänger-Themen 8
G ArrayList bei großen Zahlen langsam? Java Basics - Anfänger-Themen 10
F Teilen einer großen Grafik Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben