Frage

ich zur Zeit der Entwicklung 3D-Grafik-Anwendung mit JOGL (Java OpenGL-Bindung). Kurz gesagt, habe ich eine riesige Landschaft Binärdatei. Aufgrund seiner Größe muss ich Gelände Brocken in der Laufzeit streamen. Daher sehen wir ausdrücklich die Direktzugriffs Sorge. Ich habe bereits die erste fertig (und schmutzig :)) Implementierung (vielleicht ist es multi-threaded), wo ich einen dummen Ansatz ... Hier ist die Initialisierung von ihm:

dataInputStream = new DataInputStream(new BufferedInputStream(fileInputStream,4 * 1024);
dataInputStream.mark(dataInputStream.available());

Und wenn ich brauche zu lesen (Strom) spezielle Brocken (ich weiß schon, seine „Offset“ in der Datei) Ich führe die folgende (Schande über mich:)):

dataInputStream.reset();
dataInputStream.skipBytes(offset);
dataInputStream.read(whatever I need...);

Da ich wenig Erfahrung gemacht, dass das erste, was war ich denken konnte :) Also, bis jetzt habe ich 3 nützliche und recht interessante Artikel lesen (Ich schlage Sie, sie zu lesen, vielleicht, wenn Sie an diesem Thema interessiert sind)

  1. Byte Puffer und Nicht-Heap-Speicher -. Herr Gregory scheint belesen in Java NIO zu sein

  2. Java-Tipp: Wie Dateien schnell lesen [http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly] - Das ist eine interessante Benchmark

  3. Artikel: Tuning Java I / O-Performance [http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/] - Einfache Sun Empfehlungen, aber bitte nach unten scrollen und haben einen Blick auf „Random Access“ Abschnitt gibt; sie zeigen eine einfache Implementierung von Random (RAF) mit Selbst Pufferung Verbesserung.

Mr. Gregory bietet mehrere * .java-Dateien am Ende seines Artikels. Einer von ihnen ist ein Benchmarking zwischen Filechannel + ByteBuffer + Mapping (FBM) und RAF. Er sagt, dass er 4x Speedup bemerkt, wenn FBM im Vergleich zu RAF verwenden. Ich habe diese Benchmark in den folgenden Bedingungen lauteten:

  1. Der Offset (.. E g anstelle von Access) wird zufällig erzeugt (.. In der Datei Umfang, e g 0 - file.length ());
  2. Dateigröße ist 220 MB;
  3. 1 000 000 Zugänge (75% liest und 25% Schreibvorgänge)

Die Ergebnisse waren überwältigend:

~ 28 sec für RAF! ~ 0,2 sec für FBM!

Doch seine Umsetzung der RAF in diesem Benchmark nicht haben Selbst Pufferung (der dritte Artikel berichtet über ein), so dass ich denke, es ist die „RandomAccessFile.seek“ Methode aufrufen, die Leistung so schwer fällt.

Ok, jetzt nach all den Dingen, die ich gelernt habe, ist mit 1 Frage 1 Dilemma:)

Frage : Wenn wir die Abbildung eine Datei mit „FileChannel.map“ hat Java den gesamten Dateiinhalt in die MappedByteBuffer kopieren? Oder macht es es nur emulieren? Wenn es Kopien, dann FBM Ansatz für meine Situation nicht geeignet sind, oder?

Dilemma : Hängt davon ab, Ihre Antworten auf die Frage ...

  1. Wenn die Zuordnung kopiert eine Datei, dann scheint es, wie ich nur zwei mögliche Lösungen zu gehen: RAF + Selbst Pufferung (die aus dem 3. Artikel) oder Verwendung von Position in Filechannel (nicht mit Mapping) ... Welches wäre besser?

  2. Wenn die Zuordnung nicht eine Datei kopiert, dann habe ich 3 Möglichkeiten:. Zwei vorherigen und FBM selbst

Bearbeiten : Hier ist eine weitere Frage. Einige von euch hier sagen, dass Zuordnung nicht Datei in MappedByteBuffer kopiert. Ok dann, warum kann ich 1 GB Datei nicht dann Karte, ich bin immer „failed zur Karte“ Nachricht ...

P. S. Ich mochte eine erfüllte Antwort mit Ratschlägen erhalten, da ich nicht in der Lage bin, die konsistenten Informationen über dieses Thema im Internet zu finden.

Danke:)

War es hilfreich?

Lösung

Nein, werden die Daten nicht gepuffert. A MappedByteBuffer verweist auf die Daten unter Verwendung eines pointer . Mit anderen Worten, werden die Daten nicht kopiert, es ist einfach kartiert in den physischen Speicher. Sehen Sie sich die API-Dokumentation wenn Sie nicht haben bereits.

A speicherabgebildete Datei ist ein Segment von virtuelle Speicher, der zugeordnet wurde ein direkter Byte-für-Byte-Korrelations mit einem Teil einer Datei oder einem Datei-ähnliche Ressource. Diese Ressource ist typischerweise eine Datei, die physikalisch vorhanden auf der Festplatte, kann aber auch sein, Vorrichtung, Shared Memory-Objekt oder ein anderes Ressource, die das Betriebssystem Referenz durch einen Dateideskriptor. Einmal vorhanden, diese Korrelation zwischen die Datei und der Speicherplatz erlaubt Anwendungen der abzubildenden zu behandeln Teil als ob es primäre Speicher waren.

Quelle: Wikipedia

Wenn Sie Daten werden werden recht häufig zu lesen, ist es eine gute Idee, zumindest Cache etwas davon.

Andere Tipps

Für eine 220 MB-Datei Karte Ich würde Speicher die ganze Sache in den virtuellen Speicher. Der Grund FBM ist so schnell, es ist nicht wirklich die Daten in dem Speicher gelesen, es macht es nur zur Verfügung.

Hinweis: Wenn Sie den Test ausführen Sie müssen vergleichen, wie wie das heißt, wenn die Datei in der OS-Cache wird es viel schneller sein, egal, wie Sie es tun. Sie müssen den Test mehrmals wiederholen, um ein reproduce Lage Ergebnis zu erhalten.

Haben Sie bemerkt, dass, wenn Sie ein Programm ausführen, schließen Sie es, führen Sie es dann wieder beginnt es viel schneller zum zweiten Mal? Dies geschieht, weil das Betriebssystem die Teile der Dateien im Cache gespeichert hat, die im ersten Lauf zugegriffen wurde, und muss nicht für sie auf die Festplatte zuzugreifen. Speicherzuordnung eine Datei erlaubt im Wesentlichen ein Programm Zugriff auf diese Puffer, damit Kopien zu minimieren, wenn es zu lesen. Beachten Sie, dass Speicherzuordnung eine Datei es nicht dazu führen, lesen in den Speicher ganz werden; die Bits und Stücke, die Sie gelesen werden von der Festplatte auf Abruf lesen. Wenn das Betriebssystem feststellt, dass es wenig Speicher ist, kann es entscheiden, einige Teile der abgebildeten Datei aus dem Speicher freizugeben, und lassen Sie sie auf der Festplatte.

Edit:.. Was Sie wollen, ist FileInputStream.getChannel () Karte (), dann anzupassen, dass zu einem Inputstream, dann, dass die Verbindung zum Datainputstream

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