搁置真的很慢,占用了大量的记忆,还是我做错了什么?

时间:2014-07-26 20:35:53

标签: python shelve

我正在尝试编写一个程序,该程序使用排序字母的搁置数据库作为键,以及可以从它们创建的单词列表作为值。例如:

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

所以我写了一个函数,它接受一个文件名并将其加载到一个shelve中。第一部分,将文件转换为与搁架具有相同布局的字典,但搁置部分需要很长时间。

我正在尝试使用~100k条目的字典,每个值都是一个列表。每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)

编辑:只是一个简单的说明:dict中的每个列表长约1-3个字,不应该太大

1 个答案:

答案 0 :(得分:4)

首先 - 是的,搁置的默认泡菜后端是缓慢而低效的,你最好的选择是使用不同的东西。

第二 - 你通过编辑条目使它变得更糟,而不是让它们进入内存中的最终状态,然后再将它们序列化一次。

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;选项很多。