首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python中的内存错误

python中的内存错误
EN

Stack Overflow用户
提问于 2012-07-01 23:22:21
回答 7查看 335.6K关注 0票数 46
Traceback (most recent call last):
File "/run-1341144766-1067082874/solution.py", line 27, in 
main()
File "/run-1341144766-1067082874/solution.py", line 11, in main
if len(s[i:j+1]) > 0:
MemoryError
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 64, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
File "/usr/lib/python2.7/dist-packages/apport/__init__.py", line 1, in 
from apport.report import Report
MemoryError

Original exception was:
Traceback (most recent call last):
File "/run-1341144766-1067082874/solution.py", line 27, in 
main()
File "/run-1341144766-1067082874/solution.py", line 11, in main
if len(s[i:j+1]) > 0:
MemoryError

当我尝试运行下面的程序时,出现了上述错误。谁能解释一下什么是内存错误,以及如何克服这个问题?无效程序接受字符串作为输入,并查找所有可能的子字符串,并从中创建一个集合(按词典顺序),它应该在用户要求的相应索引处打印值,否则它应该打印‘

def main():
    no_str = int(raw_input())
    sub_strings= []
    for k in xrange(0,no_str):
        s = raw_input()
        a=len(s)
        for i in xrange(0, a):
            for j in xrange(0, a):
                if j >= i:
                    if len(s[i:j+1]) > 0:
                        sub_strings.append(s[i:j+1])
    sub_strings = list(set(sub_strings))
    sub_strings.sort()
    queries= int(raw_input())
    resul = []
    for i in xrange(0,queries):
        resul.append(int(raw_input()))
    for p in resul:
        try:
            print sub_strings[p-1]
        except IndexError:
            print 'INVALID'


if __name__ == "__main__":
   main()
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-07-02 02:34:27

这里有一个:

s = raw_input()
a=len(s)
for i in xrange(0, a):
    for j in xrange(0, a):
        if j >= i:
            if len(s[i:j+1]) > 0:
                sub_strings.append(s[i:j+1])

对于大的字符串,似乎效率很低,成本也很高。

最好这样做

for i in xrange(0, a):
    for j in xrange(i, a): # ensures that j >= i, no test required
        part = buffer(s, i, j+1-i) # don't duplicate data
        if len(part) > 0:
            sub_Strings.append(part)

buffer对象保留对原始字符串以及开始和长度属性的引用。这样,就不会发生不必要的数据重复。

长度为l的字符串具有平均长度为l/2l*l/2子串,因此内存消耗大致为l*l*l/4。有了缓冲区,它就小多了。

请注意,buffer()仅存在于2.x中。3.x有memoryview(),它的使用略有不同。

更好的方法是计算索引并按需删除子字符串。

票数 24
EN

Stack Overflow用户

发布于 2016-06-09 20:30:37

如果您得到一个意外的MemoryError,并且您认为应该有足够的内存可用,这可能是因为您使用的是32位的python安装。

如果您使用的是64位操作系统,那么最简单的解决方案就是切换到64位的python安装。

问题是32位python只能访问大约4 4GB的RAM。如果您的操作系统是32位的,由于操作系统开销的原因,这可能会进一步缩小。

您可以在此处了解更多关于32位操作系统限制为~4 4GB内存的原因:https://superuser.com/questions/372881/is-there-a-technical-reason-why-32-bit-windows-is-limited-to-4gb-of-ram

票数 42
EN

Stack Overflow用户

发布于 2012-07-01 23:59:42

memory error表示您的程序已耗尽内存。这意味着你的程序不知何故创建了太多的对象。

在您的示例中,您必须查找算法中可能会消耗大量内存的部分。我怀疑您的程序被赋予了非常长的字符串作为输入。因此,s[i:j+1]可能是罪魁祸首,因为它创建了一个新的列表。第一次使用它时,没有必要这样做,因为您没有使用创建的列表。您可以尝试查看以下内容是否有帮助:

if  j + 1 < a:
    sub_strings.append(s[i:j+1])

按照glglgl的建议,要替换第二个列表的创建,您绝对应该使用buffer对象。

还要注意,由于您使用的是if j >= i:,因此您的xrange不需要从0开始。您可以拥有:

for i in xrange(0, a):
    for j in xrange(i, a):
        # No need for if j >= i

一种更激进的选择是尝试修改算法,这样就不会预先计算所有可能的子字符串。相反,您可以简单地计算所询问的子字符串。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11283220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档