java - Java中的内存映射大文件
问题描述
是否可以在 Java 中对大文件(多个 GB)进行内存映射?
这种方法FileChannel
看起来很有前途:
MappedByteBuffer map(FileChannel.MapMode mode, long position, long size)
两者都position
允许size
64 位值——到目前为止,一切都很好。
MappedByteBuffer
但是,仅提供 32 位位置( 、 等)的方法get(int index)
,position(int newPosition)
这似乎意味着我无法映射大于 2 GB 的文件。
我怎样才能绕过这个限制?
解决方案
看看Using a memory mapped file for a huge matrix code,它展示了如何创建一个列表MappedByteBuffer
,每个小于 2 GB,以映射整个文件:
private static final int MAPPING_SIZE = 1 << 30;
...
long size = 8L * width * height;
for (long offset = 0; offset < size; offset += MAPPING_SIZE) {
long size2 = Math.min(size - offset, MAPPING_SIZE);
mappings.add(raf.getChannel().map(FileChannel.MapMode.READ_WRITE, offset, size2));
}
根据JDK-6347833 (fs) 增强 MappedByteBuffer 以在 64 位平台上支持 >2GB 的大小,2 GB 限制的原因是:
MappedByteBuffer 是一个带有额外操作的 ByteBuffer,以支持内存映射文件区域。要支持映射大于 Integer.MAX_VALUE 的区域,需要并行的类层次结构。目前唯一的解决方案是创建多个 MappedByteBuffers,其中每个对应一个不大于 2GB 的区域。
推荐阅读
- spring - 我应该使用@EnableTransactionManagement 来使用@Transactional 吗?
- gradle - 在 Gradle 中设置路径。何时使用斜杠 '/' 以及何时使用冒号 ':'
- azure - 使用 WSO2 AM 配置 Azure AD 安全 LDAP
- c# - EF 动态投影未通过最小起订量测试
- kettle - 如何在查询中转义 PDI Pentaho 中的问号 (?) 字符
- php - 如何从托管服务 1&1 中查找信息以便使用 PHP 邮件程序发送电子邮件?
- dart - Flutter:“NoSuchMethodError”不是字符串类型的子类型
- javascript - 没有实际解析的美化器?
- c# - 为什么“out”参数作为语言结构存在于 C# 中?
- spring-boot - Springboot & Thymeleaf HTML模板:转PDF后汉字消失