问题描述
我正在为游戏创建残局数据库文件。 多个线程计算游戏位置的结果,将结果保存在文件中的适当位置,同时也参考 sofar 数据库以加快计算速度。
到目前为止,我刚刚将一个 byte[] 加载到内存中,但今天早上它在尝试创建一个超过 Integer.MAX_VALUE 字节的文件时崩溃了。
我考虑了两种解决方案:
随机文件访问也很好,因为它超出了我的 RAM 限制。 我希望操作系统(Windows 10/Linux Mint 20)将大部分文件加载到 RAM 中,这样对于完全适合 RAM 的文件,它的速度与 byte[] 一样快,否则不会太糟糕(我有一个非常快的 SSD)。
这行得通还是我什至不应该打扰?
解决方法
MappedByteBuffer 和 RandomAccessFile 都有 2.1G 的限制(Integer.MAX_VALUE 字节),可能是由于内部字节数组。对我来说,使用名为 MemorySegments 的实验性东西有什么诀窍:
MemorySegmentshttps://docs.oracle.com/en/java/javase/15/docs/api/jdk.incubator.foreign/jdk/incubator/foreign/MemorySegment.html#mapFromPath(java.nio.file.Path,java.nio.channels.FileChannel.MapMode)
似乎很好而且很快,但我需要向 JVM 添加额外的参数:-/