Soy muy nuevo en Java y trato de utilizar la interfaz Java de Mathematica para acceder a un archivo usando la asignación de memoria (con la esperanza de una mejora en el rendimiento).¿Por qué no funciona el método array() de MappedByteBuffer?
El código de Mathematica que tengo es (creo) equivalente al siguiente código Java (basado en 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?
}
}
me gustaría usar el método array()
en la memoria intermedia, por lo que estoy tratando de cargar el contenido de los búferes en la memoria primero usando load()
. Sin embargo, incluso después de load()
, isLoaded()
devuelve false
, y buffer.array()
arroja una excepción: java.lang.UnsupportedOperationException at java.nio.ByteBuffer.array(ByteBuffer.java:940)
.
¿Por qué no carga el búfer y cómo puedo llamar al método array()
?
Mi objetivo final aquí es obtener una matriz de double
s usando asDoubleBuffer().array()
. El método getDouble()
funciona correctamente, pero esperaba hacerlo de una vez para obtener un buen rendimiento. ¿Qué estoy haciendo mal?
como lo estoy haciendo esto desde Mathematica, voy a publicar el código real Mathematica utilicé también (equivalente a la anterior en 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 valor de retorno de falso no implica necesariamente que el contenido del búfer no reside en la memoria física." 'load' es solo un esfuerzo y, de hecho, puede haber cargado los datos en la memoria física solo para que se cancele inmediatamente. –
@ TomHawtin-tackline Creo que entendí mal el propósito de 'cargar' en ese momento. Lo que me gustaría lograr es obtener los contenidos del buffer como una matriz de dobles. El método 'array' desafortunadamente no funciona, y arroja la excepción que mencioné. Actualicé la pregunta en función de tu opinión. – Szabolcs
'array' solo funciona para los búferes que están respaldados por una matriz (normalmente de' * Buffer.wrap'). –