【发布时间】:2010-11-06 08:51:49
【问题描述】:
我正在尝试使用 mmap 优化对大型数据集的处理。数据集在千兆字节范围内。这个想法是将整个文件映射到内存中,允许多个进程同时处理数据集(只读)。但它并没有按预期工作。
作为一个简单的测试,我只是简单地映射文件(使用 perl 的 Sys::Mmap 模块,使用我认为直接映射到底层 C 函数的“mmap”子)并让进程休眠。执行此操作时,代码在从 mmap 调用返回之前会花费超过一分钟,尽管此测试没有执行任何操作 - 甚至没有读取 mmap 文件。
猜想,我虽然可能 linux 需要在第一次映射时读取整个文件,所以在文件在第一个进程中映射后(当它处于睡眠状态时),我在另一个尝试的进程中调用了一个简单的测试读取文件的前几兆字节。
令人惊讶的是,似乎第二个进程在从 mmap 调用返回之前也花了很多时间,与第一次对文件进行 mmap 映射的时间大致相同。
我已确保正在使用 MAP_SHARED,并且第一次映射文件的进程仍然处于活动状态(它尚未终止,并且 mmap 尚未取消映射)。
我希望一个 mmaped 文件允许我让多个工作进程有效地随机访问大文件,但如果每个 mmap 调用都需要先读取整个文件,那就有点困难了。我还没有测试过使用长时间运行的进程来查看第一次延迟后访问是否很快,但我预计使用 MAP_SHARED 并且另一个单独的进程就足够了。
我的理论是 mmap 或多或少会立即返回,并且 linux 会或多或少按需加载块,但我看到的行为是相反的,表明它需要在每次调用时读取整个文件到映射。
知道我做错了什么,或者我完全误解了 mmap 应该如何工作吗?
【问题讨论】: