我有一个 50GB 的文件,它是一个排序的 csv 文件。
如果我使用 C 或 java 使用内存映射访问对该文件执行查找,理论上会有什么不同吗?
我猜因为文件访问被推到操作系统级别,它真的不应该有太大的区别,对吗?
我有一个 50GB 的文件,它是一个排序的 csv 文件。
如果我使用 C 或 java 使用内存映射访问对该文件执行查找,理论上会有什么不同吗?
我猜因为文件访问被推到操作系统级别,它真的不应该有太大的区别,对吗?
理论上,由于Java 的面向对象的方法调用需要额外的间接调用,并且可能需要跨越 Java/JNI 边界,Java 将无限慢。
在实践中,Hotspot 编译器优化了直接的 ByteBuffer 访问,页面错误的代价将远远超过额外的内存间接访问。
Java 一次只能映射 2 GB。这是因为 ByteBuffer 使用 32 位整数来表示长度、大小等。因此,您的 50 GB 文件需要 25 个 mmap。C 可以只创建一个 mmap,尽管它不能移植到 1990 年代的计算机(如果你关心的话)
直接回答问题。
Cmmap()
和 JavaFileChannel.map()
被认为是非常等价的,不会有显着的性能差异。