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

Java 缓冲一个大文件;BufferedInputStream限制为2gb;限制为2^31字节的数组,java,64-bit,buffer,bufferedinputstream,Java,64 Bit,Buffer,Bufferedinputstream,我正在按顺序处理一个大文件,我想在内存中保留一大块,在64位系统上提供16gb ram 一种快速而肮脏的方法是,简单地将输入流包装成一个缓冲输入流,不幸的是,这只给了我一个2gb的缓冲。我想有更多的记忆,我有什么选择 让操作系统处理文件的缓冲怎么样?您是否检查了不将整个文件复制到JVM内存中对性能的影响 编辑:然后可以使用RandomAccessFile或FileChannel将文件的必要部分高效地读入JVM内存。您是否考虑过java.nio中的MappedByteBuffer?这是我无法理解的

我正在按顺序处理一个大文件,我想在内存中保留一大块,在64位系统上提供16gb ram


一种快速而肮脏的方法是,简单地将输入流包装成一个缓冲输入流,不幸的是,这只给了我一个2gb的缓冲。我想有更多的记忆,我有什么选择

让操作系统处理文件的缓冲怎么样?您是否检查了不将整个文件复制到JVM内存中对性能的影响


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

您是否考虑过java.nio中的MappedByteBuffer?这是我无法理解的,但也许这正是您想要的。

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


您可以尝试缓冲块

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

操作系统将尽可能多地缓存文件,因此试图智胜缓存管理器可能不会给您带来太多好处

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


这里有一篇相关的操作类型的文章:

我也这么认为,但是看起来ByteBuffer的备份缓冲区仍然是一个正常的缓冲区,所以它与原始缓冲区具有相同的限制。有两种缓冲区,一种使用字节数组,另一种(直接)使用Java堆外的固定位置。不幸的是,它的容量不能超过2GB。这在“更多NIO特性”(可能是JDK7)中还没有得到修复。投赞成票。请参阅,以了解一个潜在的相关问题。最初它没有缓冲,java将读取一点,处理它,然后再读取一点。每次读取时,它都会发送一个IO请求,等待IO完成。缓冲输入会线性增加速度,缓冲区越大,处理速度越快。看看Java NIO,它可以执行更高效的异步文件I/O操作。请看我对你的问题的评论中的链接——它对各种方法进行了很好的比较。