создание итератора в Python из словаря с эффективным использованием памяти - PullRequest
1 голос
/ 27 марта 2011

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

mydict = defaultdict()
for line in myfile:
  # Group all lines that have the same field into a list
  mydict[line.field].append(line)

Поскольку «mydict» становится очень большим, я хотел бы превратить его в итератор, чтобы мне не приходилось хранить все это в памяти. Как я могу сделать так, чтобы вместо заполнения словаря я создал итератор, который мог бы проходить по циклу и получать все эти списки строк с одинаковым значением поля?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 марта 2011

Звучит так, как будто вам нужна база данных.Существует множество реляционных и нереляционных баз данных, которые вы можете выбрать (некоторые более эффективны, чем другие, в зависимости от того, чего вы пытаетесь достичь), но sqlite (встроенный в python) будет самым простым., если нужно обработать только небольшое количество полей line.fields, вы можете просто прочитать файлы несколько раз.

Но настоящей волшебной пули нет.

1 голос
/ 27 марта 2011

"миллионы строк" не очень велики, если только строки не длинные. Если строки длинные, вы можете сэкономить память, сохранив в файле только позиции (.tell() / .seek()).

Если файл отсортирован по line.field; Вы можете использовать itertools.groupby () .

SQL GROUP BY может помочь для файлов среднего размера (например, использование sqlite в качестве @ wisty предлагаемого ).

Для действительно больших файлов вы можете использовать MapReduce .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...