Java 从文件加载大2D int数组的最快方法是什么?
我正在从文件中加载一个2D数组,它有15000000*3整数大(最终将是40000000*3)。现在,我使用Java 从文件加载大2D int数组的最快方法是什么?,java,performance,Java,Performance,我正在从文件中加载一个2D数组,它有15000000*3整数大(最终将是40000000*3)。现在,我使用dataInputStream.readInt()顺序读取int。大约需要15秒。我可以让它显著地(至少3倍)快一点吗?或者这是我能达到的最快速度吗?将您的文件映射到内存中 Java 7代码: FileChannel channel = FileChannel.open(Paths.get("/path/to/file"), StandardOpenOption.READ); B
dataInputStream.readInt()
顺序读取int。大约需要15秒。我可以让它显著地(至少3倍)快一点吗?或者这是我能达到的最快速度吗?将您的文件映射到内存中
Java 7代码:
FileChannel channel = FileChannel.open(Paths.get("/path/to/file"),
StandardOpenOption.READ);
ByteBuffer buf = channel.map(0, channel.size(),
FileChannel.MapMode.READ_ONLY);
// use buf
有关更多详细信息,请参阅
如果使用Java 6,则必须:
RandomAccessFile file = new RandomAccessFile("/path/to/file", "r");
FileChannel channel = file.getChannel();
// same thing to obtain buf
如果需要,您甚至可以在缓冲区上使用
.asIntBuffer()
。当你需要阅读时,你只能阅读你真正需要阅读的内容。而且它不会影响您的堆。是的,您可以。来自:
如果您必须选择最快的方法,可以选择以下方法之一:
带有FileChannel
和数组读取MappedByteBuffer
带有直接的FileChannel
和数组读取ByteBuffer
带有包装数组FileChannel
和直接数组访问ByteBuffer
- 通过一次读取一个数组而不是一个字节来最小化I/O操作
时间。8KB数组的大小很好(这就是为什么它是
的默认值)BufferedInputStream
- 通过一次获取一个数组而不是一个字节的数据来最小化方法调用 每次。使用数组索引获取数组中的字节
- 如果不需要线程同步,则最小化线程同步锁
安全性。要么对线程安全类进行较少的方法调用,要么使用
非线程安全类,如
和FileChannel
MappedByteBuffer
- 最小化JVM/OS、内部缓冲区和
应用程序阵列。使用带有内存映射的
,或直接 或包装数组FileChannel
ByteBuffer
MappedByteBuffer
?这也是一个很好的答案,如果我能接受两个答案,我会的。