Sono molto nuovo in Java e sto cercando di utilizzare l'interfaccia Java di Mathematica per accedere a un file utilizzando la mappatura della memoria (nella speranza di un miglioramento delle prestazioni).Perché il metodo array() di MappedByteBuffer non funziona?
Il codice di Mathematica che ho è (credo) equivalente al seguente codice Java (sulla base di this):
import java.io.FileInputStream;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class MainClass {
private static final int LENGTH = 8*100;
public static void main(String[] args) throws Exception {
MappedByteBuffer buffer = new FileInputStream("test.bin").getChannel().map(FileChannel.MapMode.READ_ONLY, 0, LENGTH);
buffer.load();
buffer.isLoaded(); // returns false, why?
}
}
Vorrei utilizzare il metodo array()
sul buffer, quindi sto cercando di caricare il buffer memorizza i contenuti in memoria usando prima load()
. Tuttavia, anche dopo load()
, isLoaded()
restituisce false
e buffer.array()
genera un'eccezione: java.lang.UnsupportedOperationException at java.nio.ByteBuffer.array(ByteBuffer.java:940)
.
Perché il buffer non si carica e come posso chiamare il metodo array()
?
Il mio obiettivo finale qui è quello di ottenere una serie di double
s utilizzando asDoubleBuffer().array()
. Il metodo getDouble()
funziona correttamente, ma speravo di farlo in un colpo solo per ottenere buone prestazioni. Che cosa sto facendo di sbagliato?
come sto facendo questo da Mathematica, vi posterò il codice vero e proprio Mathematica ho usato troppo (equivalente a quanto sopra in Java):
Needs["JLink`"]
LoadJavaClass["java.nio.channels.FileChannel$MapMode"]
buffer = JavaNew["java.io.FileInputStream", "test.bin"]@getChannel[]@map[FileChannel$MapMode`READUONLY, 0, 8*100]
[email protected][]
[email protected][] (* returns False *)
"Un valore di ritorno falso non implica necessariamente che il contenuto del buffer non risieda nella memoria fisica." 'load' è solo il massimo degli sforzi, e in effetti potrebbe aver caricato i dati nella memoria fisica solo per essere immediatamente scambiati. –
@ TomHawtin-tackline Penso di aver frainteso lo scopo di "caricare" allora. Quello che mi piacerebbe ottenere è quello di ottenere il contenuto del buffer come una serie di doppi. Il metodo 'array' non frazionato non funziona e getta l'eccezione che ho menzionato. Ho aggiornato la domanda in base al tuo feedback. – Szabolcs
'array' funziona solo per i buffer che sono supportati da un array (in genere da' * Buffer.wrap'). –