使用Python我设法使自己成为一种术语及其含义的字典,它相当大 - x00,000项(现在无法估计,因为它们以第一个字母存储在多个文件中)。
文件是具有以下结构的pickle字典对象:
dict{word, (attribute,
kind,
[meanings],
[examples],
[connections]
)
}
如果重要的是它的Python字典对象,键为字符串,值为元组,则该元组由字符串或列表对象组成。
现在我计划将它们全部放在sqlite3数据库中,因为Python很容易。在我这样做之前,我想在sqlite3之前提出建议,如果选择好,我以前从未做过任何真正的数据库任务。
我知道答案取决于我想对这些数据做什么(除了它的结构),但是我要说它只是希望它存储在一个地方(文件)本地并且合理易于访问(查询)和可能会改变。
答案 0 :(得分:0)
是的,我已经将sqlite3用于此类事情。字典值必须首先被腌制:
import sqlite3
import pickle
import collections
class DBDict(collections.MutableMapping):
'Database driven dictlike object (with non-persistent in-memory option).'
def __init__(self, db_filename=':memory:', **kwds):
self.db = sqlite3.connect(db_filename)
self.db.text_factory = str
try:
self.db.execute('CREATE TABLE dict (key text PRIMARY KEY, value text)')
self.db.execute('CREATE INDEX key ON dict (key)')
self.db.commit()
except sqlite3.OperationalError:
pass # DB already exists
self.update(kwds)
def __setitem__(self, key, value):
if key in self:
del self[key]
value = pickle.dumps(value)
self.db.execute('INSERT INTO dict VALUES (?, ?)', (key, value))
self.db.commit()
def __getitem__(self, key):
cursor = self.db.execute('SELECT value FROM dict WHERE key = (?)', (key,))
result = cursor.fetchone()
if result is None:
raise KeyError(key)
return pickle.loads(result[0])
def __delitem__(self, key):
if key not in self:
raise KeyError(key)
self.db.execute('DELETE FROM dict WHERE key = (?)', (key,))
self.db.commit()
def __iter__(self):
return iter([row[0] for row in self.db.execute('SELECT key FROM dict')])
def __repr__(self):
list_of_str = ['%r: %r' % pair for pair in self.items()]
return '{' + ', '.join(list_of_str) + '}'
def __len__(self):
return len(list(iter(self)))
>>> d = DBDict(raymond='red', rachel='blue')
>>> d
{'rachel': 'blue', 'raymond': 'red'}
>>> d['critter'] = ('xyz', [1,2,3])
>>> d['critter']
('xyz', [1, 2, 3])
>>> len(d)
3
>>> list(d)
['rachel', 'raymond', 'critter']
>>> d.keys()
['rachel', 'raymond', 'critter']
>>> d.items()
[('rachel', 'blue'), ('raymond', 'red'), ('critter', ('xyz', [1, 2, 3]))]
>>> d.values()
['blue', 'red', ('xyz', [1, 2, 3])]
以上将使您将数据库保存在单个文件中。您可以像常规python字典一样导航对象。由于值在单个字段中进行pickle,因此sqlite不会为您提供任何其他查询选项。其他flatfile存储将有类似的限制。如果需要编写遍历层次结构的查询,请考虑使用NoSQL数据库。
答案 1 :(得分:0)
向我闻起来像文档存储数据库。查看CouchDB http://couchdb.apache.org/