搁置是否真的很慢并且占用大量内存,或者我做错了什么?

Nes*_*cio 3 python shelve

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

db['mnoo'] = ['moon', 'mono']
Run Code Online (Sandbox Code Playgroud)

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

我正在尝试使用〜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)
Run Code Online (Sandbox Code Playgroud)

编辑:只是快速的澄清:字典中的每个列表大约是1-3个字长,不应太大

Cha*_*ffy 5

首先-是的,货架的默认泡菜后端速度慢且效率低下,最好的选择是使用其他东西。

第二个问题是,通过修改条目,使它们变得更糟,而不是在序列化一次之前使它们进入内存的最终状态。

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
Run Code Online (Sandbox Code Playgroud)

如果您想要一个高效的数据库,我会去其他地方。tokyocabinet,kyotocabinet,SQLite,BDB;选项很多。

  • 可以使用多个后端,例如gdbm或bdb,只有后备腌制后端真的很慢。 (2认同)