缓冲大文件; BufferedInputStream限制为2gb; 数组限制为2 ^ 31个字节

我正在顺序处理一个大文件,我想在内存中保留一大块,在64位系统上可以使用16gb ram。

一个快速而肮脏的方法是这样做,简单地将输入流包装到缓冲的输入流中,遗憾的是,这只给了我一个2gb的缓冲区。 我想在记忆中有更多的东西,我有什么替代品?

让操作系统处理缓冲文件怎么样? 你有没有检查过不将整个文件复制到JVM内存中的性能影响是什么?

编辑:然后您可以使用RandomAccessFile或FileChannel有效地将文件的必要部分读入JVM内存。

你有没有考虑过java.nio中的MappedByteBuffer? 这是我的头脑,但也许这就是你要找的东西。

我怀疑无论如何一次缓冲超过2gb将是一个巨大的胜利。 根据您正在进行的处理量,您可以以几乎与处理一样快的速度读取。 为了加快速度,您可以尝试使用双线程生产者 – 消费者模型(一个线程读取文件并将数据交给另一个线程进行处理)。

操作系统将尽可能多地缓存文件,因此尝试超越缓存管理器可能不会让你受益匪浅。

从性能角度来看,通过将字节保留在JVM之外(在OS和JVM之间传输大量数据相对较慢),可以更好地服务。 您可以使用由直接内存块支持的MappedByteBuffer来实现此目标。

这是一篇相关的文章: 文章

我认为有64位JVM支持非标准限制。

您可以尝试缓冲块。