【发布时间】:2010-06-11 08:22:46
【问题描述】:
我需要优化我的应用程序的 RAM 使用率。
请不要让我讲课告诉我在编写 Python 时不应该关心内存。我有一个内存问题,因为我使用了非常大的默认字典(是的,我也想快点)。我目前的内存消耗是 350MB 并且还在增长。我已经无法使用共享主机,如果我的 Apache 打开更多进程,内存会翻倍和三倍……而且价格昂贵。
我已经完成了广泛的分析,并且我确切地知道我的问题出在哪里。
我有几个带有 Unicode 键的大型(>100K 条目)字典。字典从 140 字节开始并且增长很快,但更大的问题是键。 Python 优化内存中的字符串(或者我已经读过),以便查找可以是 ID 比较(“实习”它们)。不确定对于 unicode 字符串也是如此(我无法“实习”它们)。
存储在字典中的对象是元组列表(an_object, an int, an int)。
my_big_dict[some_unicode_string].append((my_object, an_int, another_int))
我已经发现值得拆分为多个字典,因为元组占用大量空间...
我发现在将字符串用作键之前,我可以通过对字符串进行散列来节省 RAM!
但不幸的是,我在 32 位系统上遇到了生日冲突。 (附带问题:有没有可以在 32 位系统上使用的 64 位密钥字典?)
Linux(生产)和 Windows 上的 Python 2.6.5。 关于优化字典/列表/元组的内存使用的任何提示? 我什至考虑过使用 C - 我不在乎这段非常小的代码是否丑陋。它只是一个奇异的位置。
提前致谢!
【问题讨论】:
-
2 个小 cmets:我真的很喜欢开箱即用的系统级答案,但是它们(例如数据库,即使缓存)真的可以在性能上与 Python 字典相提并论吗?我正在运行实时算法,而字典几乎不够快。我肯定会尝试 memcached 和 Redis(很酷),但是进程间通信对我来说足够快吗? (很抱歉现在添加这个。很难优化内存和速度......)另外,我的字典大多是只读的。我可以以某种方式使用这些知识吗?
-
“PEP 412:密钥共享词典”您可能会感兴趣。我相信它包含在 Python 3.3 python.org/dev/peps/pep-0412
-
@bcoughlan 非常酷,谢谢!可悲的是,我需要等待 2.7 的反向移植。
-
你必须使用 CPython 还是可以使用 PyPy(它对集合类型进行了一些非常聪明的优化,并且 JIT 编译为原生...)
-
我不需要做/使用任何东西。您认为 PyPy 有机会在内存和速度方面提供相同或更好的性能吗?
标签: python optimization memory-management