Я пытаюсь оптимизировать обработку больших наборов данных с помощью mmap. Набор данных находится в диапазоне гигабайт. Идея заключалась в том, чтобы отобразить весь файл в памяти, что позволило нескольким процессам работать с набором данных одновременно (только для чтения). Это не работает, как ожидалось, хотя.
В качестве простого теста я просто отображаю файл (используя модуль perl Sys :: Mmap, используя подпрограмму «mmap», который, как я считаю, отображается непосредственно в лежащую в основе функцию C), и засыпаю процесс. При этом код тратит больше минуты, прежде чем возвращается из вызова mmap, несмотря на то, что этот тест ничего не делает - даже не читает - из файла mmap.
Догадываясь, я думал, что, возможно, linux требовал, чтобы весь файл читался при первом mmap'е, поэтому после того, как файл был отображен в первом процессе (пока он спал), я вызвал простой тест в другом процессе, который пытался прочитать первые несколько мегабайт файла.
Удивительно, но второй процесс также тратит много времени, прежде чем вернуться из вызова mmap, примерно в то же время, что и mmap'инг файла в первый раз.
Я убедился, что MAP_SHARED используется и что процесс, который отобразил файл в первый раз, все еще активен (что он не завершен и что mmap не был отображен).
Я ожидал, что mmapped-файл позволит мне предоставить нескольким рабочим процессам эффективный произвольный доступ к большому файлу, но если каждый вызов mmap требует сначала прочитать весь файл, это немного сложнее. Я не проверял использование долго выполняющихся процессов, чтобы увидеть, быстрый ли доступ после первой задержки, но я ожидал, что с помощью MAP_SHARED и другого отдельного процесса будет достаточно.
Моя теория состояла в том, что mmap будет возвращать более или менее немедленно, и что linux будет загружать блоки более или менее по требованию, но поведение, которое я наблюдаю, является противоположным, указывая на то, что при каждом вызове требуется чтение всего файла. в mmap.
Есть идеи, что я делаю не так, или если я совершенно не понял, как должен работать mmap?