Speicherabgebildete Dateien in Java

8

Ich habe versucht, einen sehr schnellen Java-Code zu schreiben, der viele I / O-Operationen ausführen muss. Ich verwende eine Memory-Mapped-Datei, die einen ByteBuffer zurückgibt:

%Vor%

Das Problem, das ich habe, ist, dass die Methode ByteBuffer .array () (die ein byte [] -Array zurückgeben soll) nicht für schreibgeschützte Dateien funktioniert. Ich möchte meinen Code so schreiben, dass er sowohl mit im Speicher konstruierten Speicherpuffern als auch mit von der Platte gelesenen Puffern funktioniert. Aber ich möchte nicht alle meine Puffer eine ByteBuffer.wrap () - Funktion einpacken, weil ich befürchte, dass dies die Dinge verlangsamen wird. Also habe ich zwei Versionen von allem geschrieben, eine, die ein Byte [], die andere einen ByteBuffer braucht.

Sollte ich einfach alles einpacken? Oder sollte ich alles doppelt schreiben?

    
vy32 21.06.2009, 04:27
quelle

4 Antworten

10

Hat jemand tatsächlich nachgesehen, ob ByteBuffers , das von der Speicherzuordnungsunterstützung erstellt wurde, anfänglich .array() aufruft, unabhängig von readonly / readwrite?

Von meinem Herumstöbern ist die Antwort, soweit ich das beurteilen kann, NEIN . A ByteBuffer 's Fähigkeit, ein direktes byte[] Array über ByteBuffer.array() zurückzugeben, wird durch das Vorhandensein von ByteBuffer.hb ( byte[] ) ausgelöst, das immer auf null gesetzt wird, wenn ein MappedByteBuffer erstellt wird.

Was mich irgendwie nervt, weil ich gehofft hatte, etwas Ähnliches zu tun, was der Fragesteller machen wollte.

    
Trevor Harrison 15.07.2009, 20:27
quelle
5
___ qstnhdr ___ Speicherabgebildete Dateien in Java ___ antwort1023322 ___

Es ist immer gut, die Räder nicht neu zu erfinden. Apache bietet eine schöne Bibliothek für die Durchführung von I / O-Operationen. Sehen Sie sich Ссылка

an

Hier ist das Szenario, dem es dient. Angenommen, Sie haben einige Daten, die Sie hätten lieber im Gedächtnis behalten, aber Sie wissen nicht im Voraus, wie viele Daten da wird ... sein. Wenn es zu viel ist, möchten Sie es auf die Festplatte schreiben anstatt Speicher zu verschwenden, aber Sie wollen erst auf die Festplatte schreiben muss, weil die Festplatte langsam ist und eine Ressource ist, die verfolgt werden muss Aufräumen.

Sie erstellen also einen temporären Puffer und beginnen damit zu schreiben. Wenn / wann du Erreichen Sie die Schwelle für das, was Sie im Speicher behalten möchten, müssen Sie Erstellen Sie eine Datei, schreiben Sie heraus, was sich im Puffer dieser Datei befindet, und schreiben Sie alles nachfolgende Daten in die Datei anstelle des Puffers.

Das macht DeferredOutputStream für Sie. Es verbirgt all das Durcheinander um den Zeitpunkt der Umschaltung herum. Alles, was Sie tun müssen, ist das Erstellen der deferred Stream an erster Stelle, konfigurieren Sie den Schwellenwert und dann einfach schreibe weg nach deinem Herzen.

EDIT: Ich habe gerade eine kleine Suche mit Google durchgeführt und diesen Link gefunden: Ссылка (Blitzschnelle Datei lesen / schreiben). Sehr beeindruckend.

    
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ answer1023303 ___

Die Verwendung der Funktion ByteBuffer.wrap () verursacht keine hohe Belastung. Es weist ein einfaches Objekt zu und initialisiert ein paar ganze Zahlen. Das Schreiben Ihres Algorithmus gegen ByteBuffer ist daher Ihre beste Wahl, wenn Sie mit Nur-Lese-Dateien arbeiten müssen.

    
___ qstntxt ___

Ich habe versucht, einen sehr schnellen Java-Code zu schreiben, der viele I / O-Operationen ausführen muss. Ich verwende eine Memory-Mapped-Datei, die einen ByteBuffer zurückgibt:

%Vor%

Das Problem, das ich habe, ist, dass die Methode ByteBuffer .array () (die ein byte [] -Array zurückgeben soll) nicht für schreibgeschützte Dateien funktioniert. Ich möchte meinen Code so schreiben, dass er sowohl mit im Speicher konstruierten Speicherpuffern als auch mit von der Platte gelesenen Puffern funktioniert. Aber ich möchte nicht alle meine Puffer eine ByteBuffer.wrap () - Funktion einpacken, weil ich befürchte, dass dies die Dinge verlangsamen wird. Also habe ich zwei Versionen von allem geschrieben, eine, die ein Byte [], die andere einen ByteBuffer braucht.

Sollte ich einfach alles einpacken? Oder sollte ich alles doppelt schreiben?

    
___ tag123memorymapping ___ Eine Technik, bei der Computer-Peripheriegeräte angesprochen werden können, als ob sie Teil des Hauptspeichers des Computers wären ___ answer1023304 ___

Wrapping byte [] wird die Dinge nicht verlangsamen ... es wird keine riesigen Array-Kopien oder andere kleine Performance-Übeln geben. Von den JavaDocs: java.nio .ByteBuffer .wrap ()

  

Bringt ein Byte-Array in einen Puffer.

     

Der neue Puffer wird durch das angegebene Byte-Array unterstützt;   Änderungen am Puffer verursachen   das Array geändert werden und umgekehrt   versa. Die Kapazität des neuen Puffers und   Limit wird array.length sein   Position wird Null sein und seine Marke   wird undefiniert sein. Sein Hintergrund-Array   wird das gegebene Array und sein Array sein   Offset ist Null.

    
___ answer1133799 ___

Hat jemand tatsächlich nachgesehen, ob %code% , das von der Speicherzuordnungsunterstützung erstellt wurde, anfänglich %code% aufruft, unabhängig von readonly / readwrite?

Von meinem Herumstöbern ist die Antwort, soweit ich das beurteilen kann, NEIN . A %code% 's Fähigkeit, ein direktes %code% Array über %code% zurückzugeben, wird durch das Vorhandensein von %code% ( %code% ) ausgelöst, das immer auf null gesetzt wird, wenn ein %code% erstellt wird.

Was mich irgendwie nervt, weil ich gehofft hatte, etwas Ähnliches zu tun, was der Fragesteller machen wollte.

    
___
Gaurav Saini 21.06.2009 06:31
quelle
4

Wrapping byte [] wird die Dinge nicht verlangsamen ... es wird keine riesigen Array-Kopien oder andere kleine Performance-Übeln geben. Von den JavaDocs: java.nio .ByteBuffer .wrap ()

  

Bringt ein Byte-Array in einen Puffer.

     

Der neue Puffer wird durch das angegebene Byte-Array unterstützt;   Änderungen am Puffer verursachen   das Array geändert werden und umgekehrt   versa. Die Kapazität des neuen Puffers und   Limit wird array.length sein   Position wird Null sein und seine Marke   wird undefiniert sein. Sein Hintergrund-Array   wird das gegebene Array und sein Array sein   Offset ist Null.

    
Stu Thompson 21.06.2009 06:08
quelle
1

Die Verwendung der Funktion ByteBuffer.wrap () verursacht keine hohe Belastung. Es weist ein einfaches Objekt zu und initialisiert ein paar ganze Zahlen. Das Schreiben Ihres Algorithmus gegen ByteBuffer ist daher Ihre beste Wahl, wenn Sie mit Nur-Lese-Dateien arbeiten müssen.

    
Jherico 21.06.2009 06:04
quelle

Tags und Links