我需要将一个非常大的文件(1.11gb)读入内存并以字节为单位进行处理。我这样做的唯一方法是使用ArrayList(我不能使用byte []因为它会超出限制)。 没有办法让文件更小(我用它作为测试来测试程序处理数据的时间)。 然后我需要将一个ArrayList作为文件放回到硬盘驱动器上(仍然是1.11gb) 我不像在读书那样担心写作。 速度也是至关重要的,所以要避免分段,除非那里的任何人都有快速的方法。
答案 0 :(得分:3)
你试图以错误的方式解决这个问题(并且它不会工作 1 )。
解决此问题的可能方法是:
重新设计算法,以便它不需要将整个文件一次性读入内存......
将数据读入多个byte[]
个对象以绕过2^31
数组大小限制。
使用多个ByteBuffer
个对象 2 映射文件;见Java MemoryMapping big files。
1 - 它不起作用,因为ArrayList
内部有Object[]
,因此受到与字节数组相同的限制。此外,ArrayList<Byte>
将占用表示相同字节数的byte[]
的4到8倍的内存。或者更多,如果您使用ArrayList<Byte>
对象填充Byte
以错误的方式实例化。
2 - Buffer
API全部使用int
尺寸和偏移,而(AFAIK)不支持将文件&gt; = 2 ^ 31个字节映射到单个{{1} }。