当前位置: 首页 > 面试题库 >

python中的内存错误

王佐
2023-03-14
问题内容
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()

问题答案:

这一个在这里:

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)

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

长度的字符串l具有l*l/2平均长度的子串l/2,所以内存消耗将大致是l*l*l/4。使用缓冲区,它要小得多。

请注意,buffer()仅在2.x中存在。3.x具有memoryview(),其使用情况略有不同。

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



 类似资料:
  • 问题内容: 我正在处理几个大的txt文件,每个文件大约有800万行。以下是这些行的简短示例: 将它们存储在字典中的代码是: 它在第一个txt文件中运行良好,但是在第二个txt文件中运行时,出现错误。 我正在使用Windows 7 64bit和python 2.7 32bit,intel i5 cpu,8Gb内存。我该如何解决这个问题? 进一步说明:我有四个大文件,每个文件包含许多实体的不同信息。例

  • 问题内容: 我尝试按照此http://hadoop.apache.org/common/docs/stable/single_node_setup.html文档安装Hadoop 。当我尝试执行此 我收到以下异常 请提出一个解决方案,以便我可以尝试该示例。整个异常在下面列出。我是Hadoop的新手,我可能做过一些愚蠢的事情。任何建议将不胜感激。 问题答案: 您可以通过编辑conf / mapred-

  • 问题内容: 首先,我想提一下,我有一个3 GB的内存。 我正在研究一种在节点上时间呈指数形式的算法,因此在代码中已经有了 生成列表中所有顶点的组合,然后我可以处理其中一种排列。 但是,当我为40个顶点运行程序时,它给出了内存错误。 有没有一种更简单的实现方式可以通过它生成顶点的所有组合而不会出现此错误。 问题答案: 尝试使用由排列生成的迭代器,而不是用它重新创建一个列表: 通过这样做,python

  • 我在eclipse中运行了这个示例代码,但它给出了以下错误:从edu/stanford/nlp/models/ner/english.all.3class.distsim.crf.ser.gz中加载分类器......线程“main”Java.lang.outofmemoryerror:Java堆空间 尽管当我从Propmt命令运行Stanford CoreNLP时,一切工作都很完美。有人能告诉我解

  • 我正在使用tess4j.jar编写一个程序。该程序正在从图像中提取文本及其位置。我得到这个错误: 有趣的是,它不会出现在每张图片上。有人知道我哪里出错了吗? 这是我的代码:

  • 问题内容: 在以下示例中,我有一些有关内存使用的相关问题。 如果我在解释器中运行, 我的机器上使用的实际内存最高为80.9mb。那我 实际内存下降,但仅限于。解释器使用基线,因此不向 释放内存有什么好处?是否因为Python正在“提前计划”,以为你可能会再次使用那么多的内存? 它为什么特别释放- 释放的量基于什么? 有没有一种方法可以强制Python释放所有已使用的内存(如果你知道不会再使用那么多