Я пытаюсь оптимизировать обработку больших наборов данных с помощью mmap. Набор данных находится в диапазоне гигабайт. Идея состояла в том, чтобы объединить весь файл в память, позволяя нескольким процессам работать в наборе данных одновременно (только для чтения). Однако он работает не так, как ожидалось.Linux/perl mmap performance
Как простой тест, я просто mmap файл (используя модуль Sys :: Mmap perl, используя субмат «mmap», который, как я полагаю, непосредственно отображает базовую функцию C) и имеет процесс сна. При этом код тратит более минуты, прежде чем он вернется из вызова mmap, несмотря на то, что этот тест ничего не делает - даже чтение - из файла mmap'ed.
Угадай, хотя, возможно, Linux потребовал, чтобы весь файл был прочитан, когда он был первым, поэтому после того, как файл был отображен в первом процессе (пока он спал), я вызвал простой тест в другом процессе, который попытался прочитать первые несколько мегабайт файла.
Удовлетворительно, кажется, что второй процесс также проводит много времени, прежде чем вернуться из вызова mmap, примерно в то же время, что и mmap'ing файла в первый раз.
Я убедился, что MAP_SHARED используется и что процесс, который отображает файл в первый раз, все еще активен (что он не был завершен и что mmap не был удален).
Я ожидал, что mmapped-файл позволит мне дать нескольким рабочим процессам эффективный случайный доступ к большому файлу, но если каждый вызов mmap требует сначала прочитать весь файл, это немного сложнее. Я не тестировал длительные процессы, чтобы убедиться, что быстрый доступ после первой задержки, но я ожидал использования MAP_SHARED, и достаточно другого отдельного процесса.
Моя теория заключалась в том, что mmap вернется более или менее немедленно, и что Linux будет загружать блоки более или менее по требованию, но поведение, которое я вижу, является противоположным, указывая на то, что оно требует прочтения всего файла на каждом звоните в mmap.
Любая идея, что я делаю неправильно, или если я полностью неправильно понял, как должен работать mmap?
+1 для последующего подробного объяснения. – RichieHindle
Используйте форму 3 arg open(). –