Я изменил ваш пример следующим образом:
with open(STAT_FILE, "r+b") as f:
m=mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
while True:
line=m.readline()
if line == '': break
print line.rstrip()
Предложения:
- Не вызывайте переменную
map
, это встроеннаяв функции. - Откройте файл в режиме
r+b
, как в примере с Python на странице справки mmap
.В нем говорится: В любом случае вы должны предоставить дескриптор файла для файла, открытого для обновления .См. http://docs.python.org/library/mmap.html#mmap.mmap. - Лучше не использовать
UPPER_CASE_WITH_UNDERSCORES
имена глобальных переменных, как указано в Имена глобальных переменных в https://www.python.org/dev/peps/pep-0008/#global-variable-names. В других языках программирования (например, C),константы часто пишутся в верхнем регистре.
Надеюсь, это поможет.
Редактировать: Я провел несколько тестов синхронизации в Linux, потому что комментарий вызвал у меня любопытство.Ниже приведено сравнение времени выполнения 5 последовательных прогонов текстового файла размером 137 МБ.
Обычный доступ к файлу:
real 2.410 2.414 2.428 2.478 2.490
sys 0.052 0.052 0.064 0.080 0.152
user 2.232 2.276 2.292 2.304 2.320
mmap
доступ к файлу:
real 1.885 1.899 1.925 1.940 1.954
sys 0.088 0.108 0.108 0.116 0.120
user 1.696 1.732 1.736 1.744 1.752
Эти сроки не включают в себя оператор print
(я его исключил).Следуя этим цифрам, я бы сказал, что доступ к файлам, отображаемым в память, происходит немного быстрее.
Редактировать 2: Используя python -m cProfile test.py
Я получил следующие результаты:
5432833 2.273 0.000 2.273 0.000 {method 'readline' of 'file' objects}
5432833 1.451 0.000 1.451 0.000 {method 'readline' of 'mmap.mmap' objects}
Если я не ошибаюсь, mmap
немного быстрее.
Кроме того, кажется, что not len(line)
работает хуже, чем line == ''
, по крайней мере, так я интерпретирую вывод профилировщика.