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