【问题标题】:Script returns "Killed"脚本返回“Killed”
【发布时间】:2016-03-12 10:11:25
【问题描述】:

我有这个相当简单的脚本,它生成 1000000000(九个零)数字,然后将生成的数字存储在一个文件中,以及它们生成的次数。

import random
import csv

dic = {}

for i in range(0, 1000000000):
    n = random.randint(0, 99999)
    if n in dic:
        dic[n] += 1
    else:
        dic[n] = 1
writer = csv.writer(open('output', 'w'))
for key, value in dic.iteritems():
    writer.writerow([key, value])
writer.close()

脚本正在退出,并带有 Killed 消息。根据这个问题What does 'killed' mean?,使用dic.iteritems() 应该足以防止此类问题,但事实并非如此。

那么我该如何继续完成这样的任务呢?

【问题讨论】:

  • 如果字典是一个数组,它需要大约 3GB 的内存。你有那么多内存吗?
  • @RishavKundu - “如果它是一个数组”......但它是一个字典
  • @cricket_007 字典比数组占用更多空间。
  • 我有 12GB 内存,实际上 11GB 可用
  • 使用xrange 而不是range

标签: python


【解决方案1】:

看起来你的问题不是字典。你的问题就在这里:

for i in range(0, 1000000000):
         ^^^^^^^^^^^^^^^^^^^^

在 Python 2 上,这是一个包含 1000000000 个项目的列表,超出了您的系统可以处理的范围。你想要xrange,而不是rangexrange 按需生成数字。 (在 Python 3 上,range 执行 xrange 过去的工作,而 xrange 已不复存在。)

哦,如果您认为 11 GB 应该足够用于该列表:不是在 Python 中。试试sys.getsizeof(0) 看看一个 int 需要多少字节。

【讨论】:

  • 尽管如此,假设一个数字有 8 个字节,大约 7gb,这并不能解释被杀死的状态。
  • @RishavKundu:我实际上只是想在答案中添加一些内容。
  • 根据您的编辑,range 大约是 22GB.. xD 现在使用xrange,仍然没有完成,但它也没有崩溃
猜你喜欢
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 2013-07-16
  • 2016-03-14
  • 1970-01-01
  • 2021-09-29
  • 2015-10-18
相关资源
最近更新 更多