【问题标题】:Possibility of memory error?内存错误的可能性?
【发布时间】:2012-07-23 19:02:54
【问题描述】:
a=raw_input()
prefix_dict = {}
for j in xrange(1,len(a)+1):
    prefix = a[:j]
    prefix_dict[prefix] = len(prefix)
print prefix_dict

上面的代码有没有可能出现内存错误?这段代码在服务器上运行,服务器是一台运行 32 位 Ubuntu(Ubuntu 12.04 LTS)的四核 Xeon 机器。在少数情况下它可以工作,而在少数情况下它会显示内存错误。仅供参考:我不知道他们正在测试的情况,但输入是小写字母。输入大小

【问题讨论】:

  • 当然。特别是如果您在访问之前分配了很多大对象。
  • 有点离题,但在这段代码中,len(prefix) 将始终等于j。不需要len(prefix)
  • 我有一个问题。 raw_input() 读入的内容是否可以变得惰性,你会怎么做?

标签: python memory


【解决方案1】:

仅数据的内存量将是 1 + 2 + 3 ... + n-2 + n-1 + n 其中 n 是输入的长度,换句话说,len(a) .计算结果为 (n+1) * n/2。如果 n 是 10,000,这可以计算出大约 50 MB 的字符串数据加上 Python 字典使用多少 RAM 来存储 10,000 个条目。在我的 OSX 机器上进行测试,这似乎很少,实际上,如果我在其上运行此代码,该过程显示已使用 53.9 MB:

str = "a"
d = {}
for i in xrange(10000):
    d[str] = i
    str = str + "a"

我没有发现您的代码有任何明显的错误,当我在一个 10,000 个字母长的字符串上运行它时,它会愉快地吐出大约 50mb 来输出,所以肯定有其他问题。

top 显示进程的内存使用情况是什么?

【讨论】:

    【解决方案2】:

    也许一小段代码会有所帮助:

    prefix_dict = { a[:j]:j for j in xrange(1, len(a) + 1) }
    

    【讨论】:

    • 怎么样?几个字节码指令多占用几个字节;与存储的数据量相比,这显然是不可能的。
    • @delnan :还有prefix,因为中间存储被废弃了。也许垃圾收集器在循环期间没有工作,然后大约 5000*10000 字节保留在内存中。
    • Refcounting 一直在工作,并且循环 GC 不关心 Python 循环。但没关系,因为prefix 所指的字符串仍然可以通过predix_dict 访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多