我對Java非常陌生,嘗試使用Mathematica的Java接口使用內存映射來訪問文件(希望能夠提高性能)。爲什麼MappedByteBuffer的array()方法不起作用?
Mathematica的代碼,我是(我相信)等同於Java代碼(基於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?
}
}
我想用在緩衝區中的array()
方法,所以我試圖加載首先使用load()
將緩衝區內容存入內存。但是,即使在load()
,isLoaded()
返回false
之後,並且buffer.array()
也會拋出異常:java.lang.UnsupportedOperationException at java.nio.ByteBuffer.array(ByteBuffer.java:940)
。
爲什麼不緩衝加載,我怎樣才能調用array()
方法?
我在這裏的最終目的是使用asDoubleBuffer().array()
得到一組double
。方法getDouble()
的確可以正常工作,但我希望一舉取得這一成果,以獲得良好的性能。我究竟做錯了什麼?
當我從數學這樣做,我會後我用得(相當於上面在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 *)
「返回值爲false並不一定意味着緩衝區的內容不駐留在物理內存中。」 'load'只是最好的努力,而且事實上可能已經將數據加載到物理內存中,僅僅是爲了立即換出。 – 2011-12-21 15:38:57
@ TomHawtin-tackline我想我誤解了'load'的用途。我想實現的是將緩衝區的內容作爲一個雙精度數組來獲得。不幸的是'array'方法不起作用,並拋出我提到的異常。我根據你的反饋更新了這個問題。 – Szabolcs 2011-12-21 15:40:28
'array'只適用於由數組支持的緩衝區(通常來自'* Buffer.wrap')。 – 2011-12-21 15:46:40