valerium
@valerium
Изобретая велосипед

Есть ли аналог модуля shelve, который работает как список, а не как словарь?

Приветствую.

У меня есть список с очень большим количеством элементов. Настолько большим, что в оперативной памяти он не помещается. В таких условиях скорость работы уже не так критична, лишь бы по OOM не вывалиаться, так что можно всё это добро на диск скинуть, и уже там обрабатывать.

Входящий в стандартную библиотеку shelve очень хорош, но проблема в том, что он работает как словарь (то есть не хранит порядок), и не принимает int в качестве ключа (то есть сымитировать список будет не так просто).

Вопрос в том, есть ли готовые решения, которые могут мне помочь? Я думаю насчёт обёртки вокруг sqlite, но пока в голову только совсем уж костыльные решения приходят.

Кстати, под «как список» я имею ввиду итерируемость, а так же методы append() и pop().
  • Вопрос задан
  • 523 просмотра
Решения вопроса 3
@Roman_Kh
Тут все сильно зависит от того, что именно вы храните в этом списке, поэтому приведу несколько вариантов.

1. numpy позволяет создавать типизированные массивы и хранит их в памяти, но в весьма компактном виде (объем порой в разы меньше, чем у обычного python'овского списка) и представляет очень богатые возможности по обработке данных.

2. pandas, используя numpy, умеет создавать структурированные массивы (датафреймы), похожие на таблицы баз данных, и предоставляет развитый функционал по выборке и обработке этих данных.

3. pytables позволяет сохранить numpy-массивы или pandas-датафреймы на диск в виде файлов в формате HDF5, обеспечивая быстрый доступ к данным и опять же удобный функционал по поиску/выборке данных.
Скорее всего на ваших объемах данных pandas+HDF5 будет в разы/десятки раз быстрее любой СУБД.

4. bcolz позволяет сжать данные, а также хранить их не только в памяти, но и на диске.
При этом операции с данными производится очень быстро, иногда даже быстрее чем с несжатым списками.

Вообще, спископодобные данные гораздо быстрее обрабатывать с помощью векторных операций в numpy и pandas. Но если вам все-таки нужны именно циклы, то также рекомендую обратить внимание на numba, с помощью которой можно в десятки-сотни раз ускорить python'овские циклы.
Ответ написан
Комментировать
valerium
@valerium Автор вопроса
Изобретая велосипед
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы