缓冲大文件; BufferedInputStream限制为2gb;数组限制为2 ^ 31个字节
时间:2020-03-06 14:48:33 来源:igfitidea点击:
我正在依次处理一个大文件,并且希望将其大块内存保存在64位系统上的16gb ram内存中。
一种快速而肮脏的方法是,将输入流包装到一个缓冲的输入流中,不幸的是,这仅给了我2GB的缓冲区。我想在内存中保留更多内容,我有什么选择?
解决方案
让操作系统处理文件缓冲怎么样?我们是否检查了不将整个文件复制到JVM内存对性能有何影响?
编辑:然后,我们可以使用RandomAccessFile或者FileChannel将文件的必要部分有效地读取到JVMs内存中。
我们是否考虑过java.nio中的MappedByteBuffer?它在我头上,但也许正是我们想要的。
我认为有64位JVM将支持非标准限制。
我们可以尝试缓冲块。
我怀疑一次缓冲超过2gb是否会是一个巨大的胜利。根据我们正在执行的处理量,我们可能能够以几乎与处理一样快的速度阅读。为了加快速度,我们可以尝试使用两线程的生产者-消费者模型(一个线程读取文件并将数据交给另一个线程进行处理)。
操作系统将尽可能多地缓存文件,因此,试图使缓存管理器的性能超出智能可能不会给我们带来太多好处。
从性能的角度来看,将字节保留在JVM之外会更好地为我们服务(在OS和JVM之间传输大量数据相对较慢)。我们可以通过使用直接内存块支持的MappedByteBuffer来实现此目标。
这是一篇相关的how-to类型的文章:article