我是Java的新手,正在研究读取非常大的文件,需要一些帮助来理解问题并解决。我们有一些旧代码需要进行优化以使其正常运行。文件大小只能在10mb到10gb之间变化。仅当文件开始大小超过800mb时才会启动。

InputStream inFileReader = channelSFtp.get(path); // file reading from ssh.
byte[] localbuffer = new byte[2048];
ByteArrayOutputStream bArrStream = new ByteArrayOutputStream();

int i = 0;
while (-1 != (i = inFileReader.read(buffer))) {
bArrStream.write(localbuffer, 0, i);
}

byte[] data = bArrStream.toByteArray();
inFileReader.close();
bos.close();

我们正在得到错误
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2271)
    at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113)
    at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140)

任何帮助,将不胜感激?

最佳答案

尝试使用 java.nio.MappedByteBuffer

http://docs.oracle.com/javase/7/docs/api/java/nio/MappedByteBuffer.html

您可以将文件内容映射到内存,而无需手动复制。高级操作系统提供内存映射,而Java具有可利用该功能的API。

如果我的理解是正确的,则内存映射不会将文件的全部内容加载到内存中(意思是“根据需要部分加载和卸载”),因此我猜10GB的文件不会占用您的内存。

10-05 17:47
查看更多