shelve真的很慢且占用很多内存吗,还是我做错了什么?

3 投票
1 回答
1302 浏览
提问于 2025-04-18 14:54

我正在尝试写一个程序,这个程序使用一个存储有排序字母的数据库作为键,值则是可以用这些字母组合成的单词列表。例如:

db['mnoo'] = ['moon', 'mono']

所以我写了一个函数,它接收一个文件名并把它加载到一个 shelve(一个简单的数据库)。前面的部分,把文件转换成一个字典,格式和 shelve 一样,这部分运行得很好,但 shelve 的部分却花了很长时间。

我正在用一个大约有10万条记录的字典,每个值都是一个列表。看起来每处理1000条记录就要花15到20秒,而每条记录大约占用1KB的空间。这正常吗?
代码如下:

def save_to_db(filename, shelve_in='anagram_db'):
    dct = anagrams_from_list(process_file(filename))

    with shelve.open(shelve_in, 'c') as db:
        for key, wordlist in dct.items():
            if not key in db:
                db[key] = wordlist
            else:
                db[key].extend(wordlist)

补充说明:每个字典里的列表大约只有1到3个单词,不应该太大。

1 个回答

5

首先,没错,shelve的默认存储方式确实很慢,而且效率不高,所以你最好换个别的方式。

其次,你在编辑已经存储的内容时,让情况变得更糟了。最好是在把数据存储之前,先在内存中把它们处理到最终状态,然后只保存一次。

dct = anagrams_from_list(process_file(filename))
for key, wordlist in dct.items():
  content = {}
  for key, wordlist in dct.iteritems():
    if not key in content:
      content[key] = wordlist
    else:
      content[key].extend(wordlist)

for k, v in content.iteritems():
  db[k] = v

如果你想要一个高效的数据库,我建议你去看看其他的选择,比如tokyocabinet、kyotocabinet、SQLite、BDB等等,选择很多。

撰写回答