python - 编译成字节码占用太多内存

标签 python memory dictionary bytecode

我需要将一个非常大的字典导入 python,我遇到了一些意想不到的内存瓶颈。字典有形式,

d = {(1,2,3):(1,2,3,4), (2,5,6)=(4,2,3,4,5,6), ... }

所以每个键都是一个 3 元组,每个值都是一个相对较小的任意大小的元组(可能永远不会超过 30 个元素)。使字典变大的是键的数量。我正在使用的一个较小的示例大约有 247257 个键。我通过模拟生成这个字典,所以我可以写出一个定义这个字典的文本文件,对于我刚才提到的例子,这是一个 94MB 的文件。我遇到的瓶颈是初始编译为 python 字节码会消耗大约 14GB 的内存。因此,第一次导入字典时,我看到 RAM 使用率飙升,并且在 10 秒后,所有内容都已加载。如果 .pyc 文件已经生成,则导入几乎是即时的。使用 pymler,我确定这本字典的内存只有大约 200 MB。这里有什么交易?关于如何将此字典加载到 python 中或至少编译为字节码,我是否还有其他选择。我正在用 C++ 运行生成模拟,但我无法以我需要的任何格式编写文件。那里有什么选择(python库等)吗?我正在与一些需要将此数据作为字典的软件进行交互,因此请不要在该领域提出其他建议。另外,如果您想知道,我已经在文本文件中定义了字典,就像上面的定义一样,

d = {}
d[1,2,3] = (1,2,3,4)
d[2,5,6] = (4,2,3,4,5,6)
...

两者在编译为字节码时都会产生相同的内存峰值。事实上,第二个似乎稍微差一点,这让我感到惊讶。必须有某种方法来控制初始编译所需的 ram 数量。似乎它应该能够以某种方式一次编译一个键值对。有什么想法吗?

其他信息: 使用 python 2.6.5

最佳答案

我想问题在于,在解析文件时,会生成一个巨大的语法树,而每个元素加起来的开销很小。生成字节码后,不再需要语法树并将其转储,从而产生 200MB 的数据。

您是否尝试过将数据按以下格式存储在单独的文件中,然后在 python 中动态加载?

1,2,3=1,2,3
2,5,6=4,2,3,4,5,6

Python 脚本应如下所示:

file = open("filename")
d = {}

for line in file:
    key, val = line.split("=")
    key = tuple(key.split(","))
    d[key] = tuple(val.split(","))

file.close()

关于python - 编译成字节码占用太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6880069/

相关文章:

C++ 设置结构地址

java - 为其他对象实现等价于 String.intern()

python - 你能用 Python 中的字典值写一个 str.replace() 吗?

scala - 为什么Map添加重复项只取最后一个键的值

Python:根据 3D 投影计算对象的 2D 面积

python - Django Apache 值错误 : Attempted Relative Import in non-package

python - keras.backend的clear_session()方法没有清理拟合数据

python - Django:上传的文件没有被垃圾收集,导致内存问题

python - 来自可运行一半 Odoo 10 的字段的函数

python - Python3 中的字典帮助