Ich bin sehr neu in Java und versuche, die Java-Schnittstelle von Mathematica zu verwenden, um auf eine Datei zuzugreifen, indem ich Speichermapping verwende (in der Hoffnung auf eine Leistungsverbesserung).
Der Mathematica-Code, den ich habe, entspricht (wie ich glaube) dem folgenden Java-Code (basierend auf this ):
%Vor% Ich würde gerne die Methode array()
für den Puffer verwenden, also versuche ich, den Inhalt des Puffers zuerst in den Speicher zu laden, indem ich load()
verwende. Aber auch nach load()
gibt isLoaded()
false
zurück und buffer.array()
löst eine Ausnahme aus: java.lang.UnsupportedOperationException
at java.nio.ByteBuffer.array(ByteBuffer.java:940)
.
Warum wird der Puffer nicht geladen und wie kann ich die Methode array()
aufrufen?
Mein ultimatives Ziel ist es, ein Array von double
s mit asDoubleBuffer().array()
zu erhalten. Die Methode getDouble()
funktioniert zwar korrekt, aber ich hatte gehofft, dass dies für eine gute Leistung auf einen Schlag erledigt wird. Was mache ich falsch?
Da ich dies von Mathematica aus mache, werde ich den eigentlichen Mathematica-Code, den ich auch verwendet habe (ähnlich wie oben in Java), veröffentlichen:
%Vor% Nach Javadoc
"Der Inhalt eines gemappten Byte-Puffers kann sich jederzeit ändern, z. B. wenn der Inhalt der entsprechenden Region der zugeordneten Datei von diesem oder einem anderen Programm geändert wird. Ob oder nicht Solche Änderungen treten auf und sind, wenn sie auftreten, betriebssystemabhängig und daher nicht spezifiziert.
Der gesamte oder ein Teil eines zugeordneten Byte-Puffers kann jederzeit unzugänglich werden, z. B. wenn die zugeordnete Datei abgeschnitten wird. Ein Versuch, auf eine unzugängliche Region eines zugeordneten Byte-Puffers zuzugreifen, ändert den Inhalt des Puffers nicht und führt dazu, dass entweder zum Zeitpunkt des Zugriffs oder zu einem späteren Zeitpunkt eine nicht spezifizierte Ausnahme ausgelöst wird. Es wird daher dringend empfohlen, geeignete Vorkehrungen zu treffen, um die Manipulation einer zugeordneten Datei durch dieses Programm oder durch ein gleichzeitig ausgeführtes Programm zu vermeiden, außer um den Inhalt der Datei zu lesen oder zu schreiben. "
Für mich scheint es zu vielen Bedingungen und unerwünschtem Fehlverhalten. Brauchst du besonders diesen Kurs?Wenn Sie Dateiinhalte nur auf dem schnellsten Weg lesen müssen, versuchen Sie es:
%Vor%Es arbeitet mit einer Geschwindigkeit, die fast der Testgeschwindigkeit des Plattensystems entspricht.
Für double können Sie DoubleBuffer (mit double [] array wenn f.length () / 4 size) verwenden oder einfach getDouble (int) von ByteBuffer aufrufen.
in Java:
%Vor%es ist nicht einmal für MappedByteBuffer implementiert, sondern für HeapByteBuffer.
in Android:
%Vor%und wieder nicht in MappedByteBuffer, aber zum Beispiel ByteArrayBuffer implementiert das Backing-Array.
%Vor% Der Punkt der Speicherzuordnung ist nicht auf dem Heap zu liegen. Ein Backing-Array wäre auf dem Heap.
Wenn Sie den FileChannel von RandomAccessFile öffnen und dann die Map auf dem Kanal aufrufen können, können Sie auch die bulk get () -Methode für den MappedByteBuffer in ein Byte [] einlesen. Dies kopiert von Off-Heap und vermeidet IO, in Heap wieder.
Tags und Links java wolfram-mathematica memory-mapped-files jlink