Python大变量RAM usag

2024-04-19 09:08:06 发布

您现在位置:Python中文网/ 问答频道 /正文

假设有一个dict变量在运行时变大,变成数百万个key:value对。

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

让口译员显示整个dict是个坏主意,但是只要一次访问一个键就可以了吗?


Tags: key内存value系统dictram时变口译员
3条回答

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

也有人说几百万件不应该有问题,我不太确定。dict开销本身(在计算键和值占用的内存之前)是很重要的。对于Python2.6或更高版本,sys.getsizeof提供了一些有用的信息,说明各种Python结构占用了多少RAM。一些快速的结果,来自64位OS X机器上的Python2.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字节(如果许多不同的键共享相同的值,则可能会更少)。

因此,在一台典型的机器上,不需要就可以将数百万个dict项消耗掉。

数以百万计的条目主要关心的不是词典本身,而是每个条目占用了多少空间。不过,除非你做了些奇怪的事,否则它们应该是合适的。

但是,如果你有一个有数百万个键的dict,你可能做错了什么。您应该执行以下一项或两项操作:

  1. 找出你应该实际使用的数据结构,因为一个dict可能不是正确的答案。这到底是什么取决于你在做什么。

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

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

在解释器中显示数以百万计的项没有什么意义,但是访问单个元素应该仍然非常有效。

相关问题 更多 >