2013-02-28 3 views
1

У меня есть несколько миллионов записей, которые я хочу хранить, извлекать, удалять довольно часто. Каждая из этих записей имеет «ключ», но «значение» нелегко переводится в словарь, поскольку это произвольный объект Python, возвращенный модульным методом, который я не писал (я понимаю, что много иерархических структур данных например, json работают лучше, чем словари, и не уверены, что json является предпочтительной базой данных в любом случае).Python: сохранение/извлечение/обновление большого количества произвольных объектов

Я собираюсь разложить каждую запись в отдельном файле. Есть ли способ лучше?

ответ

3

Используйте модуль shelve.

Вы можете использовать его в качестве словаря, как и в случае с json, но он хранит объекты с использованием соленья.

Из питона официальной документации:

import shelve 

d = shelve.open(filename) # open -- file may get suffix added by low-level 
          # library 

d[key] = data # store data at key (overwrites old data if 
       # using an existing key) 
data = d[key] # retrieve a COPY of data at key (raise KeyError if no 
       # such key) 
del d[key]  # delete data stored at key (raises KeyError 
       # if no such key) 
flag = d.has_key(key) # true if the key exists 
klist = d.keys() # a list of all existing keys (slow!) 

# as d was opened WITHOUT writeback=True, beware: 
d['xx'] = range(4) # this works as expected, but... 
d['xx'].append(5) # *this doesn't!* -- d['xx'] is STILL range(4)! 

# having opened d without writeback=True, you need to code carefully: 
temp = d['xx']  # extracts the copy 
temp.append(5)  # mutates the copy 
d['xx'] = temp  # stores the copy right back, to persist it 

# or, d=shelve.open(filename,writeback=True) would let you just code 
# d['xx'].append(5) and have it work as expected, BUT it would also 
# consume more memory and make the d.close() operation slower. 

d.close()  # close it 
+0

Значит, он будет мариновать все в один файл? – hatmatrix

+0

Вы говорите это ...;) – lolopop

1

Я хотел бы оценить использование базы данных ключ/значение, как BerkeleyDB, КИОТСКИХ шкаф или другие. Это даст вам все интересные вещи и улучшит работу с дисковым пространством. В файловой системе с размером блока 4096B один миллион файлов занимает ~ 4 ГБ независимо от размера ваших объектов (как нижний предел границы, если объекты больше 4096B, размер увеличивается).