python中的内存错误

python中的内存错误,python,memory,Python,Memory,当我试图运行以下程序时,出现了上述错误。有人能解释什么是内存错误,以及如何克服这个问题吗该程序将字符串作为输入,查找所有可能的子字符串,并从中创建一个集合(按字典顺序),并应在用户要求的相应索引处打印值,否则应打印“无效” Traceback (most recent call last): File "/run-1341144766-1067082874/solution.py", line 27, in main() File "/run-1341144766-1067082874/sol

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

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
A表示您的程序内存不足。这意味着您的程序以某种方式创建了太多的对象

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

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()
一个更激进的选择是尝试重新设计算法,这样就不会预先计算所有可能的子字符串。相反,您可以简单地计算所请求的子字符串。

这里的这个:

for i in xrange(0, a):
    for j in xrange(i, a):
        # No need for if j >= i
对于大型字符串来说,似乎效率很低,而且成本很高

最好

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])
缓冲区对象保留对原始字符串、开始和长度属性的引用。这样,就不会发生不必要的数据重复

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

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


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

您可以尝试创建弹出错误的同一脚本,通过从外部脚本导入将脚本分成多个脚本。例如,hello.py预期会出现错误内存错误,因此我将hello.py分成几个脚本h.py e.py ll.py o.py所有脚本都必须进入文件夹“hellohello”到该文件夹createinit.py到init write import h,e,ll,o然后在ide上使用python 64位编写import hellohello可以解决很多问题。

如果出现意外的
内存错误,并且您认为应该有足够的RAM可用,这可能是因为您使用的是32位python安装

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

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


您可以在此处了解32位操作系统限制为~4GB内存的更多原因:

使用此输入检查程序:abc/如果您有ab ac bc之类的设备,abc程序工作正常,您需要一个更强大的RAM,否则程序就错了。

您的代码中有错误或内存不足,您可以升级它,或者尝试增加虚拟内存以获得快速解决方案

  • 打开我的电脑
  • 单击鼠标右键并选择“属性”
  • 转到高级系统设置
  • 单击“高级”选项卡
  • 增加内存大小,这将增加虚拟内存大小

  • 您的内存不足:我想您的内存可能不足,可以发布您的输入数据吗?@Gustavralson我不知道输入数据,这是interviewstreet的问题。@kratos字符串
    abcd
    的预期输出是什么?如果您有
    内存错误
    ,并且您认为有足够的RAM可用,检查以确保您使用的是64位版本的python!请看下面我的完整解释,我已经知道,再解释一下为什么会发生这种情况会更有帮助。我只是想给你的问题的标题提供一个清晰的答案,以防其他人发现它在寻找
    MemoryError
    和Python。@kratos你自找的:“有人能解释什么是记忆错误吗,“也许其他用户可以说它解决问题的原因?windows切换的快速说明,-检测是否运行32位stackoverflow.com/questions/1842544-从python.org下载64位版本,并安装它-将您的PATH变量更新为新安装请查看七年前的公认答案,以了解解决问题的原因以及与此类似的问题。仅仅因为一个程序处理少量数据而处理更复杂的数据失败并不意味着该程序“运行良好”或OP需要更多RAM。如现有答案所述,这可能是由于代码效率低下,甚至仅使用32位版本的解释器造成的,这限制了可用RAM(与实际安装的RAM数量无关),
    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)