我有一个50GB的文件,它是一个已排序的csv文件。
如果我使用C或java使用内存映射访问对此文件执行查找,理论上会有什么不同吗?
我猜测,因为文件访问被推到了操作系统级别,所以它真的不应该做出很大的改变吗?
答案 0 :(得分:2)
在理论中,由于Java的面向对象方法调用需要额外的间接性,并且可能由于需要跨越Java / JNI边界,因此Java将无限小。
在 practice 中,Hotspot编译器优化了直接的ByteBuffer访问,并且页面错误的成本将远远超过额外的内存间接。
答案 1 :(得分:1)
直接回答问题。
C mmap()
和Java FileChannel.map()
被认为是相当的,并且不会有明显的性能差异。
答案 2 :(得分:1)
Java一次只能映射2 GB。这是因为ByteBuffer使用32位整数来表示长度,大小等等。因此,50 GB文件需要25 mmaps。 C只能创建一个mmap,虽然它不能移植到20世纪90年代的计算机上(如果你关心的话)