我正在从文件中加载一个2D数组,它是15,000,000 * 3整数(最终将是40,000,000 * 3)。现在,我使用dataInputStream.readInt()
来顺序读取整数。大约需要15秒。我可以使它显着(至少3倍)更快,或者这个速度和我一样快吗?
答案 0 :(得分:7)
将文件映射到内存中!
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
有关详细信息,请参阅here。
如果您使用Java 6,则必须:
RandomAccessFile file = new RandomAccessFile("/path/to/file", "r");
FileChannel channel = file.getChannel();
// same thing to obtain buf
如果需要,您甚至可以在缓冲区上使用.asIntBuffer()
。当您需要阅读时,您只能阅读实际需要阅读的内容。 和它不会影响你的堆。
答案 1 :(得分:7)
是的,你可以。来自benchmark of 13 different ways of reading files:
如果你必须选择最快的方法,那就是其中之一:
FileChannel
,MappedByteBuffer
,数组读取。FileChannel
使用直接ByteBuffer
并且数组读取。FileChannel
包含数组ByteBuffer
和直接数组访问。为了获得最佳的Java读取性能,需要记住以下四点:
BufferedInputStream
的默认值)。FileChannel
和MappedByteBuffer
。FileChannel
或直接映射
或包裹数组ByteBuffer
。