【发布时间】:2011-10-16 08:12:40
【问题描述】:
我需要将一个非常大的字典导入 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
【问题讨论】:
-
您是否将数据分隔在文件的多行中?
-
两种方法我都试过了:1)单个巨型字典定义,2)多行 d[key] = value
-
为什么不使用
pprint.pformat将字典写入文件并在加载时使用eval或ast.literal_eval? -
这在我上周工作的 60MB 矩阵上运行良好...
-
我可能是错的,但听起来这些是 python 函数。使用它们将涉及首先将字典加载到 python 中,这正是问题所在。还是这些 C++ 建议?
标签: python memory dictionary bytecode