我正在按顺序处理一个大文件,我想将其中的一大块保存在内存中,在 64 位系统上可用 16gb 内存。
一种快速而肮脏的方法是这样做,只需将输入流包装到缓冲输入流中,不幸的是,这只给了我一个 2gb 的缓冲区。我想有更多的记忆,我有什么选择?
我正在按顺序处理一个大文件,我想将其中的一大块保存在内存中,在 64 位系统上可用 16gb 内存。
一种快速而肮脏的方法是这样做,只需将输入流包装到缓冲输入流中,不幸的是,这只给了我一个 2gb 的缓冲区。我想有更多的记忆,我有什么选择?
让操作系统处理文件的缓冲怎么样?您是否检查过不将整个文件复制到 JVM 内存中对性能的影响是什么?
编辑:然后您可以使用 RandomAccessFile 或 FileChannel 有效地将文件的必要部分读入 JVM 内存。
你考虑过 java.nio 中的 MappedByteBuffer 吗?它在我的头上,但也许这就是你正在寻找的。
我怀疑一次缓冲超过 2GB 将是一个巨大的胜利。根据您正在执行的处理量,您可能能够以几乎与处理速度一样快的速度阅读。为了加快速度,您可以尝试使用双线程生产者-消费者模型(一个线程读取文件并将数据交给另一个线程进行处理)。
操作系统将尽可能多地缓存文件,因此试图智取缓存管理器可能不会让你得到太多。
从性能的角度来看,将字节保留在 JVM 之外会得到更好的服务(在操作系统和 JVM 之间传输大量数据相对较慢)。您可以通过使用由直接内存块支持的 MappedByteBuffer 来实现此目标。
这是一篇相关的文章类型: 文章
我认为有 64 位 JVM 将支持非标准限制。
您可以尝试缓冲块。