使用python迭代一个大字典(超过20亿条目)

Bah*_*har 3 python dictionary

我是python的新手,我想循环一个包含大约20亿个条目的字典.使用:

for key,value in edge_dict.items():
Run Code Online (Sandbox Code Playgroud)

但是我失去了内存异常,因为它似乎试图加载整个东西然后循环它们.我有一些琐碎的事情,比如:

for i in range (2000000000)
Run Code Online (Sandbox Code Playgroud)

但我可以很容易地用它们代替它们

while (i < 2000000000):
    i++ 
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题.但是对于字典,我不知道如何在不使用for-in迭代器的情况下检查密钥.(请注意,键是字符串,值是整数).

Jor*_*ley 8

for key,value in edge_dict.iteritems():
Run Code Online (Sandbox Code Playgroud)

我想是你想要的

同样如果

for i in range (2000000000)
Run Code Online (Sandbox Code Playgroud)

导致内存错误,您可以使用迭代器

for i in xrange(2000000000)
Run Code Online (Sandbox Code Playgroud)

迭代器(和/或生成器)一次只加载一个项目并在迭代时被消耗...这修复了内存中大型列表可能存在的许多问题

  • 请注意,这是Python 2.x独有的.在Python 3.x中,`dict.items`和`range`都返回生成器,因此不需要`iteritems`或`xrange`(它们实际上甚至不存在). (5认同)
  • 我会在这里重复我的回答作为评论/警告,因为它更适合这种格式:迭代这么大的字典可能是一个糟糕设计的标志.在您的情况下,查看是否可以在源处过滤数据,无论是来自数据库查询还是其他内容. (3认同)
  • 你可能想要解释迭代器和列表之间的区别...... (2认同)