GHH*_*GHH 9 python memory dictionary bytecode
我需要将一个非常大的字典导入到python中,并且我遇到了一些意想不到的内存瓶颈.字典有形式,
d = {(1,2,3):(1,2,3,4), (2,5,6)=(4,2,3,4,5,6), ... }
Run Code Online (Sandbox Code Playgroud)
所以每个键都是一个3元组,每个值都是一个相对较小的任意大小的元组(可能永远不会超过30个元素).使字典变大的原因是键的数量.我正在使用的一个较小的例子大约有247257个键.我通过模拟生成这个字典,所以我可以写出一个定义这个字典的文本文件,对于我刚刚提到的例子,这是一个94MB的文件.我遇到的瓶颈是初始编译为python字节代码会占用大约14GB的内存.所以我第一次导入字典时,我看到RAM使用率上升了,经过10秒后,所有内容都被加载了.如果已生成.pyc文件,则导入几乎是即时的.使用pympler,我已经确定这个字典在内存中只有大约200 MB.这是什么交易?关于如何将此字典加载到python或至少编译为字节代码,我还有其他选项吗?我正在用C++运行生成模拟,我无法以任何我需要的格式编写文件.那里有没有选项(python库等)?我正在与一些需要这些数据作为字典的软件接口,所以请不要在该领域提出其他建议.另外,如果你想知道,我已经在文本文件中定义了字典,就像上面的定义一样,
d = {}
d[1,2,3] = (1,2,3,4)
d[2,5,6] = (4,2,3,4,5,6)
...
Run Code Online (Sandbox Code Playgroud)
两者在编译到字节代码时都提供相同的内存峰值.事实上,第二个似乎稍差,这对我来说是令人惊讶的.必须有一些方法来驯服初始编译需要的ram数量.看起来它应该能够以某种方式一次编译一个键值对.有任何想法吗?
其他信息:使用python 2.6.5
我猜测当您执行“import module_containing_humungous_dict_statement”时,您的编译峰值会发生。那么,无论您只有一条语句还是 247257 个单独的赋值语句,整个模块仍然会立即编译。您可以尝试使用单独赋值语句形式,然后打开文件,一次读取一行,然后执行它。那么你一次只能编译一行。可能需要一段时间。
| 归档时间: |
|
| 查看次数: |
710 次 |
| 最近记录: |