Производительность Linux / Perl Mmap

Я пытаюсь оптимизировать обработку больших наборов данных с помощью mmap. Набор данных находится в диапазоне гигабайт. Идея заключалась в том, чтобы отобразить весь файл в памяти, что позволило нескольким процессам работать с набором данных одновременно (только для чтения). Однако он работает не так, как ожидалось.

В качестве простого теста я просто отображаю файл (используя модуль perl Sys :: Mmap, используя подпрограмму «mmap», который, как я считаю, отображается непосредственно в лежащую в основе функцию C), и засыпаю процесс. При этом код тратит больше минуты, прежде чем возвращается из вызова mmap, несмотря на то, что этот тест ничего не делает - даже не читает - из файла mmap & ed.

Я догадываюсь, что, хотя, возможно, linux требовал, чтобы весь файл читался при первом редактировании mmap, поэтому после сопоставления файла в первом процессе (пока он спал) я вызвал простой тест в другом процессе, который пытался прочитать первые несколько мегабайт файла.

Удивительно, но второй процесс также тратит много времени, прежде чем вернуться из вызова mmap, примерно в то же время, что и mmap в первый раз.

Я удостоверился, что MAP_SHARED используется и что процесс, который отобразил файл в первый раз, все еще активен (что он не завершен и что mmap не был отображен).

Я ожидал, что mmapped-файл позволит мне предоставить нескольким рабочим процессам эффективный произвольный доступ к большому файлу, но если каждый вызов mmap требует сначала прочитать весь файл, это немного сложнее. Я не тестировал с использованием длительных процессов, чтобы увидеть, быстрый ли доступ после первой задержки, но я ожидал, что с помощью MAP_SHARED и другого отдельного процесса будет достаточно.

Моя теория состояла в том, что mmap будет возвращать более или менее немедленно, и что linux будет загружать блоки более или менее по требованию, но поведение, которое я наблюдаю, является противоположным, указывая на то, что оно требует чтения всего файла при каждом вызове mmap.

Любая идея, что я делаю неправильно, или если я полностью неправильно понял, как должен работать mmap?

Ответы на вопрос(9)

Ваш ответ на вопрос