我的部分应用程序一起使用trie到chunk个单词。例如,["Summer", "in", "Los", "Angeles"]
变为["Summer", "in", "Los Angeles"]
。
现在,这个trie在应用程序启动时从a large database填充,本地存储为SQL。这需要很长时间,大约15秒。我想减少应用程序启动时间,所以我看了序列化Trie。不幸的是,pickling太慢了 - 比从数据库加载所有内容要慢。
有没有更快的方法来序列化我的特里?
以下是Trie类的内容:
class Trie:
def __init__(self):
self.values = set()
self.children = dict()
def insert(self, key, value):
"""Insert a (key,value) pair into the trie.
The key should be a list of strings.
The value can be of arbitrary type."""
current_node = self
for key_part in key:
if key_part not in current_node.children:
current_node.children[key_part] = Trie()
current_node = current_node.children[key_part]
current_node.values.add(value)
def retrieve(self, key):
"""Returns either the value stored at the key, or raises KeyError."""
current_node = self
for key_part in key:
current_node = current_node.children[key_part]
return current_node.values
有没有办法改变它会使它更具序列化?
答案 0 :(得分:3)
我知道我没有给出python答案,但这仍然有用:
创建,压缩和存储trie真的是一项艰巨的任务。我花了很多时间考虑自动建议的数据结构,据我所知,最优雅的解决方案是由Giuseppe Ottaviano提供的partly described in my blog article
即使在python中实现Ottaviano as described in his paper的整个解决方案没有意义,但仍然可能有理由遵循基本思想将完整的trie存储为一大块内存并且只引用了下一步跳转的位置。
通过这种方式,您可以轻松地将此阵列或内存块序列化到硬盘。我不完全确定python,但我认为这个操作应该工作,并且比序列化数据结构快得多。
我知道存在Ottavianos工作的c实现,你甚至可以使用python c绑定。
答案 1 :(得分:1)
我最终将trie存储在MongoDB中。
存在网络开销,但如果数据库在localhost上,那就不算太糟了。