我在尝试优化使用mmap处理大型数据集。数据集是在千兆字节范围内。这个想法是将整个文件映射到内存中,允许多个进程同时处理数据集(只读)。它虽然没有按预期工作。Linux/perl mmap性能
作为一个简单的测试,我简单地mmap文件(使用perl的Sys :: Mmap模块,使用我认为直接映射到底层C函数的“mmap”子),并让进程处于睡眠状态。在执行此操作时,代码花费超过一分钟才从mmap调用返回,尽管此测试无法执行任何操作 - 即使是读取操作,也不会执行mmap的文件。
猜测,虽然也许linux需要整个文件在第一次mmap化时被读取,所以在文件在第一个进程中映射(当它正在休眠时)之后,我在另一个进程中调用了一个简单的测试,试图读取文件的前几兆字节。
令人惊讶的是,似乎第二个过程在从mmap调用返回之前花费了大量的时间,大约与第一次mmap处理文件的时间相同。
我已经确定MAP_SHARED正在被使用,并且第一次映射文件的过程仍然是活动的(它没有终止,并且mmap没有被映射)。
我期望一个mmapped文件可以让我给多个工作进程有效地随机访问大文件,但是如果每个mmap调用都需要先读取整个文件,那么这有点困难。我还没有测试过使用长时间运行的进程来查看第一次延迟后访问是否快速,但我期望使用MAP_SHARED,而另一个单独的进程就足够了。
我的理论是,mmap会立即返回,linux会根据需要或多或少地加载块,但是我看到的行为是相反的,表明它需要读取每个文件的整个文件调用mmap。
任何想法我做错了,或者如果我完全误解了mmap应该如何工作?
+1以了解详细说明。 – RichieHindle 2009-06-27 21:06:25
使用3 arg形式的open()。 – 2009-06-28 03:55:23