我需要将一个非常大的字典导入 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/