高效的读取,加载和卸载到java中非常大的二进制文件的内存部分的方法。

时间:2018-04-24 20:04:51

标签: java performance memory

我需要读取包含表示大量粒子位置的浮点数的二进制文件的内容,并将此信息传递给我的程序,以便将它们渲染到屏幕上。该文件包含每帧的每个粒子的位置,因此可以大到10或更多GB。

我的计划是用程序所需的下一帧填充所有可用内存。一旦显示了一个帧,我需要释放该空间并从文件中加载一个新帧。如果请求某个帧(比如第12帧),我需要转到文件中的这个帧并读取它,以及适合内存的所有其他连续帧。

问题是,我如何阅读,然后以有效的方式存储这些信息?

我做了一些研究,并阅读了类似的问题。 数组和向量不是一个选项,因为它可以容纳大约2GB的数据,当我可以加载比ram更多。此外,初始化这样大小的数组似乎会导致“内存不足异常”,扩展数组需要花费太多时间。

Buffer a large file; BufferedInputStream limited to 2gb; Arrays limited to 2^31 bytes

MappedByteBuffer可能是一个选项,但它也限制为2 GB,我不明白它是如何工作的。

我还可以使用外部库来保存缓冲区之外的数据(但是哪一个?),或者使用ByteBuffer,我想,但是在这种情况下最好的选择是什么?

简而言之,我需要快速读取文件(可能是部分内容,除非有其他方法),并尽可能多地保存在内存中,并将这些信息逐帧传递给另一个线程。如何读取此文件,以及将数据存储在内存中的哪个位置?

Read large files in Java 这个源似乎解决了类似的问题,但它是关于阅读文本,似乎他可以使用MappedByteBuffer或BufferedInputStream,因为他的文件只有1.5 GB。

0 个答案:

没有答案