Python列表实现和pympler测量

时间:2013-12-30 15:54:02

标签: python list memory size

我需要解析文件(~500 Mb)并将其部分加载到list,我不需要整个文件。

我有一种感觉,python为list分配的内存大得多,它包含的数据大小。

我尝试使用asizeof的{​​{1}}以估算过度杀伤但是它失败了pympler这对我来说很奇怪,我想如果我有一个MemoryError在内存中list应该只运行它总和所有实体的大小和它。

然后我拿了初始文件的大块,我对列表asizeof的大小感到震惊。列表大小是文件大小的三倍。

问题是asizeof给出的大小是否正确,在python中使用list的更有效方法是什么。当asizeof因记忆错误而失败时,如何检查较大列表的大小。

1 个答案:

答案 0 :(得分:2)

查看用于读取/解析文件的代码以及如何调用pympler.asizeof将会很有帮助。

asizeof和Pympler中的所有其他工具都在profiled过程中工作(使用Python的内省工具来导航参考图)。这意味着在调整具有大量节点(对象)的参考图时,分析开销可能会成为问题 - 特别是如果在开始分析之前已经紧张内存。致电asizeof时,请务必设置all=Falsecode=False。无论如何,请file a bug on GitHub。也许在这种情况下可以避免内存不足。

据我所知,只要asizeof返回单个对象的正确大小(假设Python> = 2.6),sys.getsizeof报告的大小就是准确的。您可以在调用asizeof时设置align=1,并查看这些数字是否更符合您的预期。

您还可以通过平台的工具或pympler.process检查流程的虚拟大小:

from pympler.process import ProcessMemoryInfo
pmi = ProcessMemoryInfo()
print ("Process virtual size [Byte]: " + str(pmi.vsz)) 

此指标应始终高于asizeof在调整对象大小时报告的内容。