快速序列化特里

时间:2014-04-25 04:47:17

标签: python serialization nlp pickle trie

我的部分应用程序一起使用triechunk个单词。例如,["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

有没有办法改变它会使它更具序列化?

2 个答案:

答案 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上,那就不算太糟了。