【问题标题】:accessing Dictionary from different programs从不同的程序访问字典
【发布时间】:2012-02-16 16:53:48
【问题描述】:

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

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

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

【问题讨论】:

  • 字典的键值类型有哪些?
  • MySQL这样的数据库服务器适合吗?
  • 是否可以将所有这些“程序”简单地加入一个程序,在不退出的情况下执行所有必要的任务?
  • @Sven Marnach 那时不可能在一个程序中加入所有人。它也使调试变得非常懒惰:(
  • @SvenMarnach 键值是简单文本(键是日期/时间值是一些文本)

标签: python dictionary python-daemon


【解决方案1】:

这不适用于符合您描述的所有情况,但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

【讨论】:

  • 分析得真好,可惜好像没人看。您的系统上支持anydbm 的数据库是什么?这将对性能产生巨大影响,尤其是如果它恰好是dumbdbm
  • @SvenMarnach, whichdb.whichdb('f.db') -> bdsdb185.
  • 谢谢。根据anydb 文档,首先尝试了bsddb,所以它似乎被认为是最快的。
【解决方案2】:

使用 Python 的 anydbm 模块来制作具有持久化键和值的字典的最简单方法是。您基本上可以创建一个文件,其作用类似于将字符串映射到字符串的字典。

【讨论】:

  • +1 -- 这是我总是忘记的那些现成模块之一。但它比泡菜快多少?或许我会在有机会的时候做一些时间安排……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 2020-01-16
相关资源
最近更新 更多