Как читать строки из файла mmap в python?

Кажется, что интерфейс mmap поддерживает только readline (). Если я пытаюсь перебрать объект, я получаю символ вместо полных строк.

Каким был бы «питонический» метод чтения файла в формате mmap'ed?

import sys import mmap import os if (len(sys.argv) > 1): STAT_FILE=sys.argv[1] print STAT_FILE else: print "Need to know <statistics file name path>" sys.exit(1) with open(STAT_FILE, "r") as f: map = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ) for line in map: print line # RETURNS single characters instead of whole line 

  • Веб-программирование на Python
  • Как проверить, был ли virtualenv создан с '--no-site-пакетами'?
  • Модуль платформы Python не обнаруживает окна 10
  • Какой инструментарий gui следует использовать с Pygame?
  • Автоматическое связывание переменных области в закрытии
  • Петли Python против списков понимания против карты для побочных эффектов (т. Е. Не используя возвращаемые значения)
  • Как заменить экземпляр в __init __ () на другой объект?
  • Parse updateinfo.xml
  • 3 Solutions collect form web for “Как читать строки из файла mmap в python?”

    Самый сжатый способ повторения строк mmap – это

     with open(STAT_FILE, "r+b") as f: map = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ) for line in iter(map.readline, ""): # whatever 

    Я изменил ваш пример следующим образом:

     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 глобальных переменных UPPER_CASE_WITH_UNDERSCORES , как указано в глобальных именах переменных на http://www.python.org/dev/peps/pep-0008 . В других языках программирования (например, C) константы часто записываются в верхнем регистре.

    Надеюсь это поможет.

    EDIT: Я сделал некоторые тесты времени на Linux, потому что комментарий сделал мне любопытным. Ниже приведено сравнение таймингов в 5 последовательных прогонах в текстовом файле 137 МБ.

     # normal file access. 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 file access. 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 (я исключил его). Следуя этим номерам, я бы сказал, что доступ к файлам с памятью памяти намного быстрее.

    EDIT 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 == '' , по крайней мере так я интерпретирую вывод профилировщика.

    Ниже приводится достаточно краткий:

     with open(STAT_FILE, "r") as f: m = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ) while True: line = m.readline() if line == "": break print line m.close() 

    Обратите внимание, что line сохраняет новую line , поэтому вы можете ее удалить. Это также причина, почему if line == "" делает правильную вещь (пустая строка возвращается как "\n" ).

    Причина, по которой исходная итерация работает так, как она делает, заключается в том, что mmap пытается выглядеть как файл, так и строка. Он выглядит как строка для целей итерации.

    Я понятия не имею, почему он не может (или не хочет) предоставлять readlines()/xreadlines() .

    Python - лучший язык программирования в мире.