我在Windows7 32位平台上使用mathematica 8.0.1.0.我尝试导入数据
Import[file,”Table”]
Run Code Online (Sandbox Code Playgroud)
只要文件(文件中的数组)足够小,它就可以正常工作.但是对于更大的文件(38MB)/阵列(9429乘2052),我得到的信息是:
No more memory available. Mathematica kernel has shut down. Try quitting other applications and then retry.
Run Code Online (Sandbox Code Playgroud)
在具有更多主内存的Windows7 64位平台上,我可以导入更大的文件,但我认为有一天,当文件增长/数组有更多行时,我会遇到同样的问题.
所以,我试图找到一个导入大文件的解决方案.在搜索了一段时间之后,我在这里看到了一个类似的问题:处理Wolfram Mathematica中的大数据文件的方法.但似乎我的mathematica知识不足以使建议的OpenRead,ReadList或类似的数据适应我的数据(参见这里的示例文件).问题是我需要文件中数组的其余程序信息,例如某些列和行中的Dimensions,Max/Min,我正在对某些列和每一行进行操作.但是当我使用例如ReadList时,我从来没有得到与我使用Import相同的数组信息(可能是因为我以错误的方式进行).
有人可以给我一些建议吗?我很感激每一个支持!
我是Java的新手,并尝试使用Mathematica的Java接口来使用内存映射来访问文件(希望提高性能).
我所拥有的Mathematica代码(我相信)相当于以下Java代码(基于此):
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?
}
}
Run Code Online (Sandbox Code Playgroud)
我想array()在缓冲区上使用该方法,所以我首先尝试将缓冲区内容加载到内存中load().但是,即使之后load(),isLoaded()返回false并buffer.array()抛出异常:java.lang.UnsupportedOperationException
at java.nio.ByteBuffer.array(ByteBuffer.java:940).
为什么不加载缓冲区以及如何调用该array()方法?
我的最终目标是获得一系列double的使用asDoubleBuffer().array().该方法getDouble()确实可以正常工作,但我希望能够一次完成这项工作以获得良好的性能.我究竟做错了什么?
正如我在Mathematica中所做的那样,我将发布我使用的实际Mathematica代码(相当于Java中的上述代码):
Needs["JLink`"]
LoadJavaClass["java.nio.channels.FileChannel$MapMode"]
buffer = JavaNew["java.io.FileInputStream", "test.bin"]@getChannel[]@map[FileChannel$MapMode`READUONLY, 0, 8*100] …Run Code Online (Sandbox Code Playgroud)