Хранить и загружать большое количество связанных объектов в Python - PullRequest
2 голосов
/ 25 мая 2011

У меня много объектов, которые образуют сеть, сохраняя ссылки на другие объекты. Все объекты (узлы) имеют свои свойства.

Теперь я ищу быстрый способ хранения этих объектов (в файле?) И перезагрузки всех их в память позже (мне не нужен произвольный доступ). Объем данных составляет около 300 МБ, и загрузка из моего формата SQL занимает 40 с, но теперь я хочу кэшировать их для более быстрого доступа.

Какой метод вы бы предложили?

(моя попытка засолки не удалась из-за ошибок рекурсии, несмотря на попытки возиться с getstate :( может быть, что-то быстрое в любом случае?:))

Ответы [ 3 ]

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

«Модуль pickle отслеживает объекты, которые он уже сериализовал, поэтому последующие ссылки на тот же объект больше не будут сериализованы». Так что можно. Возможно, увеличьте предел рекурсии с sys.setrecursionlimit.

Максимальная глубина рекурсии при использовании Python's Pickle / cPickle

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

Возможно, вы могли бы установить некоторый уровень косвенности, где объекты фактически содержатся в, скажем, другом словаре, и объект, ссылающийся на другой объект, будет хранить ключ объекта, на который ссылаются, и затем получать доступ к объекту через словарь.Если объект для хранимого ключа отсутствует в словаре, он будет загружен в словарь из базы данных SQL, а когда он больше не нужен, объект можно удалить из словаря / памяти (возможно, с помощьюобновление до ее состояния в базе данных до удаления версии из памяти).

Таким образом, вам не нужно загружать все данные из вашей базы данных одновременно, и вы можете хранить несколько объектов в кэше.в памяти для более быстрого доступа к тем.Недостатком может быть дополнительная нагрузка, необходимая для каждого доступа к основному диктату.

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

Рассол был бы моим первым выбором. Но так как вы говорите, что это не сработало, вы можете попробовать полку , даже подумав, что это не основная цель полки.

На самом деле, вы должны использовать Pickle для этого. Возможно, вы могли бы опубликовать некоторый код, чтобы мы могли взглянуть и выяснить, почему он не работает

...