繁体   English   中英

加载字典的最快方法

[英]fastest way to load in a dictionary

我有一个非常大的字典,大约有400万个键,我目前在阅读大文本文件后得到。 我需要我的脚本运行得更快,现在我正在寻找一种正确的方法来做到这一点。 我正在尝试将字典保存到某个地方以便更快地访问它,但是使用pickle实际上是将我的速度降低到150秒才能读取它! 读取文本文件要快得多,这看起来很奇怪。 我也尝试使用sqlite将其保存到数据库中,但这也花了太长时间......这种问题通常如何解决?

如果你使用python2,我建议使用wiredtiger作为快速键/值存储。 我建议使用wiredtiger develop分支。 如果您的系统上安装了swig3和python2-dev,则可以执行以下操作来安装wiredtiger:

git clone https://github.com/wiredtiger/wiredtiger --branch=develop
cd wiredtiger
./autogen.sh && ./configure --enable-python && make && make install

这是一个小数据库类,允许使用字符串值获取和设置字符串键:

from wiredtiger import wiredtiger_open


WT_NOT_FOUND = -31803


class KV(object):

    def __init__(self, path):
        # init wiredtiger
        self._wiredtiger = wiredtiger_open(path, 'create')
        self.session = self._wiredtiger.open_session()
        # create key/value table
        self.session.create('table:kv', 'key_format=S,value_format=S')
        self.kv = self.session.open_cursor('table:kv')

    def close(self):
        self._wiredtiger.close()

    def __setitem__(self, key, value):
        self.kv.set_key(key)
        self.kv.set_value(value)
        self.kv.insert()

    def __getitem__(self, key):
        self.kv.set_key(key)
        if self.kv.search() == WT_NOT_FOUND:
            msg = "key '%s' not found" % key
            raise KeyError(msg)
        else:
            return self.kv.get_value()


kv = KV('./data')
kv['foo'] = 'bar'
assert kv['foo'] == 'bar'

如果使用wiretiger是令人生畏的,你可以尝试使用plyvel绑定 leveldb。 API非常简单,但速度要慢得多。

使用plyvel,您可以执行以下操作:

import plyvel

db = plyvel.DB('/tmp/testdb/', create_if_missing=True)
db.put('key', 'value')
# later
assert db.get('key') == 'value'

否则,如果您使用python2,则有内置搁置模块

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM