gpt4 book ai didi

Java NIO MappedByteBuffer OutOfMemoryException

转载 作者:太空宇宙 更新时间:2023-11-04 15:17:55 26 4
gpt4 key购买 nike

我真的遇到了麻烦:我想使用 FileChannelMappedByteBuffer 读取超过几个 GB 的巨大文件 - 我发现的所有文档都表明映射相当简单使用 FileChannel.map() 方法的文件。当然,由于所有 Buffer 方法都使用 int 表示位置、限制和容量,因此存在 2GB 的限制 - 但是低于该限制的系统隐含限制又如何呢?

实际上,我遇到了很多关于 OutOfMemoryException 的问题!并且根本没有任何文档真正定义了限制!那么 - 如何将符合 int-limit 的文件安全地映射到一个或多个 MappedByteBuffer 而不会出现异常?

在尝试 FileChannel.map() 之前,我能否询问系统我可以安全地映射文件的哪一部分?如何?为什么有关此功能的文档这么少?

最佳答案

我可以提供一些工作代码。这是否能解决您的问题很难说。这会在文件中寻找 Hunter 识别的模式。

参见优秀文章Java tip: How to read files quickly用于原始研究(不是我的)。

// 4k buffer size.
static final int SIZE = 4 * 1024;
static byte[] buffer = new byte[SIZE];

// Fastest because a FileInputStream has an associated channel.
private static void ScanDataFile(Hunter p, FileInputStream f) throws FileNotFoundException, IOException {
// Use a mapped and buffered stream for best speed.
// See: http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly
FileChannel ch = f.getChannel();
long red = 0L;
do {
long read = Math.min(Integer.MAX_VALUE, ch.size() - red);
MappedByteBuffer mb = ch.map(FileChannel.MapMode.READ_ONLY, red, read);
int nGet;
while (mb.hasRemaining() && p.ok()) {
nGet = Math.min(mb.remaining(), SIZE);
mb.get(buffer, 0, nGet);
for (int i = 0; i < nGet && p.ok(); i++) {
p.check(buffer[i]);
}
}
red += read;
} while (red < ch.size() && p.ok());
// Finish off.
p.close();
ch.close();
f.close();
}

关于Java NIO MappedByteBuffer OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20715945/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com