Что такое хорошая «установленная» на диске реализация для Python? - PullRequest
4 голосов
/ 19 мая 2011

Я работаю над программой на Python, которая должна хранить постоянную «заданную» структуру данных, содержащую много хеш-значений фиксированного размера (SHA256, но это не важно).Критическими операциями являются insert и lookup .Удалить не нужно для обычной работы.Набор будет расти со временем и, в конечном итоге, не все уместится в памяти.

Я рассмотрел:

  • a set, сохраненный на диске с использованием pickle (медленно [несколько секунд] для записи нового файла на диск, в конечном итоге не помещается в память)
  • база данных SQLite (дополнительная зависимость по умолчанию недоступна)
  • настраиваемая дисковая сбалансированная древовидная структура, такая как B-дерево или аналогичное

В идеале должен быть встроенный модуль Python, который предоставляет что-то, что может поддерживать эти операции.Какой хороший вариант здесь?

После того, как я это написал, я нашел Быстрые дисковые хеш-таблицы? , в котором есть несколько хороших идей.Мне нравится, что mmap / bucket принимает ответ.

(Это для перезаписи shaback , если вам интересно.)

Ответы [ 4 ]

4 голосов
/ 19 мая 2011

Другим вариантом является использование полки , я знаю, что это то же самое, что и маринованные (под капотом), но я думаю, что это хороший вариант (которого я не видел в вашем списке вариантов :-) ) или, может быть, если вы не возражаете против использования сторонней библиотеки, вы можете взглянуть на shove (это как полка ++).

0 голосов
/ 22 января 2014

Дбм и установка второго значения в качестве произвольного значения 1, как предложил Брайан Минтон, является удобным решением.cPickle тоже хорош

Тем не менее, вы также должны рассмотреть возможность использования json.Проверьте Google, но AFAIK, кажется, что парсер json работает быстрее, чем Pickle / cPickle.(например, http://kovshenin.com/2010/pickle-vs-json-which-is-faster/)

0 голосов
/ 02 августа 2012

Вы можете использовать базу данных в стиле DBM.Я делаю то же самое с dbm, просто храню все ключи со значением '1'.Поскольку это BSD, модуль dbhash должен работать.(это устарело, поэтому нет Python 3; и из-за этого не очень хорошая идея для долгосрочного использования).В противном случае используйте модули gdbm (dbm.gdbm в Python 3) и ndbm (dbm.dbm в Python 3).Также есть модуль dumbdbm (dbm.dumbdbm в Python 3), который является чистым python и всегда работает, но немного медленнее.Кроме того, если вы собираетесь выполнять несколько одновременных операций чтения и записи, определенно не используйте модуль dumbdbm.

Все различные модули dbm работают так же, как словарь python, за исключением того, что ключи и значения должны быть строками,Вы можете использовать ключевое слово «in» так же, как и для набора, или для указания.

0 голосов
/ 19 мая 2011

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

...