2015-05-24 33 views
-1

我需要将一个非常大的文件(1.11gb)读入内存并以字节为单位进行处理。我做这件事的唯一方法是使用一个ArrayList(我不能使用一个字节[],因为那么它将超出限制)。 没有办法让文件变小(我用它作为测试来测试我的程序处理数据的时间)。 然后我需要将一个ArrayList作为一个文件放回到硬盘驱动器(仍然是1.11GB) 我并不担心写作,因为我正在阅读。 速度也是至关重要的,所以要避免子分段,除非任何人在那里都有快速的方法。从ArrayList中读取/写入文件内容<Byte>

+3

请解释:_I不能用一个byte []因为那将超过limit_ –

+1

'ArrayList的'是'的byte []'引擎盖 – kaykay

+4

@kaykay不,它不是,它是一个对象下[] 。它使用4或8倍于字节数组的内存。 – immibis

回答

3

您试图以错误的方式解决此问题(并且它不会工作)。

解决这个可能的方法是:

  • 重新设计算法,它不需要读取整个文件到内存......一气呵成。

  • 将数据读取到多个byte[]对象中以避开2^31数组大小限制。

  • 使用多个ByteBuffer对象映射文件;见Java MemoryMapping big files


1 - 它不会起作用,因为ArrayListObject[]内,因此是受您与字节数组相同的限制。另外,ArrayList<Byte>将占用比代表相同字节数的byte[]多4至8倍的内存。或者更多,如果用Byte填充ArrayList<Byte>对象实例化方式不正确。

2 - 的Buffer的API都使用int大小和偏移量,以及(AFAIK)不支持的文件> = 2^31字节映射到单个Buffer