Python: быстрая загрузка 7 ГБ текстовых файлов в строки Unicode - PullRequest
2 голосов
/ 06 сентября 2010

У меня большой каталог текстовых файлов - примерно 7 ГБ.Мне нужно быстро загрузить их в строки Python Unicode в iPython.У меня всего 15 ГБ памяти.(Я использую EC2, поэтому я могу купить больше памяти, если это абсолютно необходимо.)

Простое чтение файлов будет слишком медленным для моих целей.Я попытался скопировать файлы на виртуальный диск и затем загрузить их оттуда в iPython.Это ускоряет процесс, но iPython дает сбой (не хватает памяти?) Вот настройка виртуального диска:

mount -t tmpfs none /var/ramdisk -o size=7g

У кого-нибудь есть идеи?По сути, я ищу постоянные объекты Python в памяти.Требование iPython исключает использование IncPy: http://www.stanford.edu/~pgbovine/incpy.html.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 09 сентября 2010

Здесь много путаницы, которая затрудняет ответ на этот вопрос:

  • Требование ipython.Почему вам нужно обрабатывать такие большие файлы данных из ipython вместо автономного скрипта?
  • RAM-диск tmpfs.Я читаю ваш вопрос как подразумевающий, что вы читаете все свои входные данные в память сразу в Python.Если это так, то python выделяет свои собственные буферы для хранения всех данных в любом случае, а файловая система tmpfs дает вам выигрыш в производительности, только если вы многократно перезагружаете данные с RAM-диска.
  • УпоминаниеIncPy.Если ваши проблемы с производительностью вы можете решить с помощью заметок, почему вы не можете просто реализовать памятку для тех функций, где это больше всего поможет?

Итак.Если вам действительно нужны все данные в памяти одновременно - например, если ваш алгоритм повторно обрабатывает весь набор данных несколько раз - я бы посоветовал взглянуть на модуль mmap.Это предоставит данные в виде необработанных байтов вместо unicode объектов, что может повлечь за собой немного больше работы в вашем алгоритме (например, при работе с закодированными данными), но будет использовать разумный объем памяти.Для одновременного считывания данных в объекты Python unicode потребуется в 2 или 4 раза больше оперативной памяти, чем она занимает на диске (при условии, что данные имеют формат UTF-8).

Если ваш алгоритм просто выполняет одну линейную операциюПередав данные (как и алгоритм Aho-Corasick, о котором вы упомянули), вам будет гораздо удобнее просто читать по кусочкам разумного размера:

with codecs.open(inpath, encoding='utf-8') as f:
    data = f.read(8192)
    while data:
        process(data)
        data = f.read(8192)

Надеюсь, это по крайней мере получитты ближе.

2 голосов
/ 11 сентября 2010

Я видел упоминание IncPy и IPython в вашем вопросе, поэтому позвольте мне подключить мой проект, который немного ориентирован на IncPy, но работает с IPython и хорошо подходит для больших данных: http://packages.python.org/joblib/

Если вы храните ваши данные в массивах numpy (строки могут храниться в массивах numpy), joblib может использовать memmap для промежуточных результатов и быть эффективным для ввода-вывода.

...