繁体   English   中英

Python大变量RAM使用率

[英]Python large variable RAM usage

假设有一个dict变量在运行时变得非常大 - 达到数百万个键:值对。

这个变量是否存储在RAM中,有效地耗尽了所有可用内存并减慢了系统的其余部分?

要求翻译显示整个字典是个坏主意,但只要一次访问一个密钥就可以了吗?

是的,dict将存储在进程内存中。 因此,如果它足够大以至于系统RAM中没有足够的空间,那么当系统开始与磁盘交换内存时,您可能会看到大幅减速。

其他人说,几百万件物品不应该成为问题; 我不确定。 dict开销本身(在计算键和值所占用的内存之前)非常重要。 对于Python 2.6或更高版本, sys.getsizeof提供了一些关于各种Python结构占用多少RAM的有用信息。 一些快速的结果,来自64位OS X机器上的Python 2.6:

>>> from sys import getsizeof
>>> getsizeof(dict((n, 0) for n in range(5462)))/5462.
144.03368729403149
>>> getsizeof(dict((n, 0) for n in range(5461)))/5461.
36.053470060428495

因此,dict开销在每个项目36个字节和每个项目144个字节之间变化(确切的值取决于字典的内部哈希表的填充程度;这里5461 = 2 ** 14 // 3是其中一个阈值内部哈希表被放大)。 这是在添加dict项目本身的开销之前; 如果它们都是短字符串(比方说是6个字符或更少)那么每个项目仍然会增加另一个> = 80字节(如果许多不同的密钥共享相同的值,则可能更少)。

因此,它不会采取多万元字典项用尽典型的机器上RAM。

数以百万计的项目主要关注的不是字典本身,而是每个项目占用多少空间。 尽管如此,除非你做一些奇怪的事情,否则他们应该适合。

但是,如果你有一个拥有数百万个密钥的字典,你可能会做错事。 你应该做一个或两个:

  1. 弄清楚你应该使用什么数据结构,因为单个dict可能不是正确的答案。 这究竟是什么取决于你在做什么。

  2. 使用数据库。 你的Python应该附带一个sqlite3模块,所以这是一个开始。

是的,Python dict存储在RAM中。 然而,几百万个键对于现代计算机来说不是问题。 如果您需要越来越多的数据并且RAM用完,请考虑使用真实的数据库。 选项包括关系数据库,如SQLite(顺便说一下,内置在Python中)或像Redis这样的键值存储。

在解释器中显示数百万个项目毫无意义,但访问单个元素应该仍然非常有效。

据我所知,Python使用最好的散列算法,因此您可能会获得最佳的内存效率和性能。 现在,整个事物是保存在RAM中还是提交到交换文件都取决于您的操作系统,具体取决于您拥有的RAM量。 我想说的最好是尝试一下:

from random import randint
a = {}
for i in xrange(10*10**6):
    a[i] = i

你跑的时候看起来怎么样? 在我的系统上大约需要350Mb,至少可以说是可管理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM