Performanter Zugriff auf Dateien
-
Ich habe sehr große Dateien aus denen ich im Laufe der Ausführung meines Programms immer wieder bestimmte Bereiche (random access) laden möchte.
Die API sieht vereinfacht so aus:
class MyAPI { MyAPI (File dataFile) Foo getFooFromFile (long beginPosInFile, long endPosInFile) }
Ich kann nicht zu Beginn des Programms alle Foo-Elemente laden, das bringt meinen Speicher locker zum Überlaufen.
Ich habe dementsprechend einen Cache im Programm der um diese MyAPI rundherum gebaut ist und dort möglichst viele Foo-Objekte bereit hält. Der Zugriff dauert aber länger, dementsprehcend kann es durchaus vorkommen, dass manche Foo-Objekte mehrmals aus der Datei geladen werden, da sie zwischenzeitlich bereits aus dem Cache geworfen worden sind. Außerdem wie gesagt keine lineare Bearbeitung von vorne nach hinten in der Datei.
Was ist nun der performanteste Weg hier Daten aus dem Speicher zu laden? Es kommt sehr häufig vor, dass Foo-Objekte geladen werden, dementsprechend wird der I/O-Load hoch sein. Zahlt es sich aus Teile des Speichers für MemoryMapping abzutreten? Wenn ja, wie funktioniert das in Java, so dass sich Java selbst darum kümmert die für mich günstigsten 250 MB (Beispielswert) in den Speicher zu mappen bzw. selbst bei Misses andere Bereiche zu laden? Hat das Sinn? Soll ich stattdessen einfach ein RandomAccessFile verwenden? FileChannel.transferTo?
Hints? Suggestions?
MfG SideWinder
-
SideWinder schrieb:
Wenn ja, wie funktioniert das in Java, so dass sich Java selbst darum kümmert die für mich günstigsten 250 MB (Beispielswert) in den Speicher zu mappen bzw. selbst bei Misses andere Bereiche zu laden?
Hast du den MappedByteBuffer ausprobiert?
-
Ich habe noch gar nichts ausprobiert, ich frage ja gerade ob RAF, FileChannel oder MappedByteBuffer geeigneter ist
MfG SideWinder