我需要解析文件(~500 Mb)并将其部分加载到list
,我不需要整个文件。
我有一种感觉,python为list
分配的内存大得多,它包含的数据大小。
我尝试使用asizeof
的{{1}}以估算过度杀伤但是它失败了pympler
这对我来说很奇怪,我想如果我有一个MemoryError
在内存中list
应该只运行它总和所有实体的大小和它。
然后我拿了初始文件的大块,我对列表asizeof
的大小感到震惊。列表大小是文件大小的三倍。
问题是asizeof
给出的大小是否正确,在python中使用list的更有效方法是什么。当asizeof
因记忆错误而失败时,如何检查较大列表的大小。
答案 0 :(得分:2)
查看用于读取/解析文件的代码以及如何调用pympler.asizeof
将会很有帮助。
asizeof
和Pympler中的所有其他工具都在profiled过程中工作(使用Python的内省工具来导航参考图)。这意味着在调整具有大量节点(对象)的参考图时,分析开销可能会成为问题 - 特别是如果在开始分析之前已经紧张内存。致电asizeof
时,请务必设置all=False
和code=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
在调整对象大小时报告的内容。