在python中存储和使用大文本文件的最佳方法
我正在为我用python编写的沼泽克隆创建一个联网服务器,该服务器可以接受用户,解决木板并为玩家的输入打分。我正在使用的词典文件为1.8MB(ENABLE2K词典),我需要它可用于多个游戏求解器类。现在,我有了它,以便每个类逐行迭代文件并生成哈希表(关联数组),但是实例化的求解器类越多,占用的内存就越多。
我想做的是一次导入字典文件,然后根据需要将其传递给每个求解器实例。但是,这样做的最佳方法是什么?我应该将字典导入全局空间,然后在求解器类中将其作为globals()['dictionary']进行访问吗?还是应该导入字典,然后将其作为参数传递给类构造函数?其中之一比另一个更好吗?还有第三种选择吗?
解决方案
即使在这一点上本质上是单身人士,也适用于反对全局变量的通常论点。对于pythonic单例替换,请查找" borg"对象。
那真的是唯一的区别。创建字典对象后,除非传递明确的深层副本,否则传递时仅绑定新的引用。有意义的是,只要每个求解器实例不需要专用副本进行修改,就可以一次且仅一次对其进行集中构造。
如果我们创建一个dictionary.py模块,其中包含读取文件并构建字典的代码,则该代码将仅在首次导入时执行。进一步的导入将返回对现有模块实例的引用。因此,课程可以:
import dictionary dictionary.words[whatever]
在dictionary.py具有:
words = {} # read file and add to 'words'
根据dict所包含的内容,我们可能对" shelve"或者" anydbm"模块感兴趣。它们为我们提供类似dict的界面(仅字符串作为'anydbm'的键和项,字符串作为键和'shelve'的项作为任何python对象),但数据实际上位于DBM文件(gdbm,ndbm,dbhash, bsddb,具体取决于平台上提供的功能。)我们可能仍希望根据需要在类之间共享实际的数据库,但是这样可以避免解析文本文件的步骤以及保持所有内容的完整性。 -内存位。
亚当,请记住,在Python中,当我们说:
a = read_dict_from_file() b = a
...我们实际上并没有在复制'a',因此使用了更多的内存,我们只是在使'b'成为对同一对象的另一个引用。
因此,基本上,我们提出的任何解决方案在内存使用方面都会好得多。基本上,一次阅读字典,然后继续引用它。无论我们是使用全局变量执行此操作,还是将其传递给每个实例或者其他操作,我们都将引用同一对象而不是复制它。
哪一个是最适合Python的?这就是"蠕虫的另一罐",但这是我个人要做的:
def main(args): run_initialization_stuff() dictionary = read_dictionary_from_file() solvers = [ Solver(class=x, dictionary=dictionary) for x in len(number_of_solvers) ]
HTH。