python - 从不同的程序访问字典

标签 python dictionary python-daemon

我正在用一个大文件创建字典。

def make_dic():
    big_dic={}
    for foo in open(bar):
           key,value=do_something(foo)
           big_dic[key]=value
def main():
    make_dic() #this takes time

我必须通过完全不同的程序多次访问这本词典。阅读这个文件和制作字典需要很多时间。是否可以制作一本即使一个程序退出也保留在内存中的字典????这样我就可以创建它一次,但可以在不同的程序中一次又一次地使用它....

最佳答案

这不适用于符合您描述的所有情况,但是 cPickle应该有助于提高速度。

我能想到的唯一问题是将数据持久化与 IPC 结合起来很困难。因此,如果这些不同的程序同时修改字典,pickle 将无济于事。另一种方法可能是使用数据库...

我喜欢Sven Marnach的建议,但有一些权衡值得考虑。一些设置...

>>> pickle_file = open('pickle_foo', 'w')
>>> anydbm_file = anydbm.open('anydbm_foo', 'c')
>>> d = dict((str(i), str(j)) for i, j in zip(range(999999, -1, -1), range(0, 1000000)))

显然填充 anydbm_file 会很慢:

>>> %timeit for k, v in d.iteritems(): anydbm_file[k] = v
1 loops, best of 3: 5.14 s per loop

该时间与转储和加载 pickle 文件所花费的时间相当:

>>> %timeit cPickle.dump(d, pickle_file)
1 loops, best of 3: 3.79 s per loop
>>> pickle_file.close()
>>> pickle_file = open('pickle_foo', 'r')
>>> %timeit d = cPickle.load(pickle_file)
1 loops, best of 3: 2.03 s per loop

但是 anydbm_file 您只需创建一次;然后,再次打开它几乎是瞬间的。

>>> %timeit anydbm_file = anydbm.open('anydbm_foo', 'r')
10000 loops, best of 3: 74.3 us per loop

所以 anydbm 在那里有优势。另一方面,

>>> %timeit for i in range(1, 1000): x = anydbm_file[str(i)]
100 loops, best of 3: 3.15 ms per loop
>>> %timeit for i in range(1, 1000): x = d[str(i)]
1000 loops, best of 3: 374 us per loop

anydbm_file 中读取一个键值比从内存中的字典中读取一个键值要长十倍。您必须针对这种差异进行大量查找,以超过泡菜转储/加载周期所需的 5 秒;但即使您不这样做,此处读取时间的差异也可能导致性能低下,具体取决于您在做什么。

其他选项是SQLite3或(对于允许来自同时运行的多个进程的连接的单独数据库服务器进程),psycopg2 + PostgreSQL .

关于python - 从不同的程序访问字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9315442/

相关文章:

python - 如何让 python 守护进程在停止时执行操作

python - pyenv-virtualenv : Python and PIP not changed when activating/deactivating virtual environment 的问题

c# - 将项目添加到字典会导致 NullReferenceException

regex - 如何从 RDD 中的键中删除双引号并将 JSON 分成两行?

python - 我可以让一些代码像守护进程一样在 Django 中不断运行吗

Python多线程: How to keep daemon thread running

python - 如何在 Django shell 中执行 Python 表达式之前和之后运行脚本?

python - 我如何与假装成终端的子进程进行交互?

python - 如何根据同一模型中其他字段的值设置django模型字段值

r - 把区名放在地 block 上