2013-03-25 78 views
1

我有一个50GB的文件,这是一个排序的CSV文件。执行mmap时,C或Java会有什么显着的性能差异?

如果我正在使用C或java使用内存映射访问执行对此文件的查找,理论上会有什么区别吗?

我猜是因为文件访问被推到操作系统级别,它真的不应该有太大的区别是正确的吗?

回答

2

理论,Java将是因为需要对由于Java的面向对象的方法调用,并且可能由于需要跨越的Java/JNI边界附加间接寻址无穷慢。

练习,Hotspot编译器优化了直接的ByteBuffer访问,并且页面错误的代价将远远超过额外的内存间接。

+1

作为一个评论,我会将CSV转换为固定长度的二进制格式以供使用。 – parsifal 2013-03-25 15:20:27

+0

java可以执行大于10GB的内存映射文件吗?任何限制? – loyalflow 2013-03-25 18:26:03

+0

@ user1361315 - 您可能需要使用'-XX:MaxDirectMemorySize'选项(例如:'-XX:MaxDirectMemorySize = 64g'。这是作为映射缓冲区的垃圾回收的内部触发器。我不确定哪些版本需要它;肯定是1.6,我预计也是1.7。 – parsifal 2013-03-25 18:38:34

1

直接回答问题。

C的mmap()和Java的FileChannel.map()被认为是相当多的等价物,不会有显着的性能差异。

1

Java一次只能映射2 GB。这是因为ByteBuffer在长度,大小等方面使用32位整数。因此,对于50 GB文件,您需要25 mmaps。 C可以创建一个mmap,尽管它不能移植到20世纪90年代的计算机(如果你关心的话)

相关问题