erro de memória em python

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

os erros acima apareceram quando tentei executar o seguinte programa. Alguém pode explicar o que é um erro de memória, e como superar este problema? . o programa pega strings como entrada e encontra todas as sub strings possíveis e cria um conjunto (numa ordem lexicográfica) a partir dele e deve imprimir o valor no respectivo índice pedido pelo Utilizador, caso contrário deverá imprimir 'inválido'

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()
Author: Ashwini Chaudhary, 2012-07-01

5 answers

Este aqui.
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])

Parece ser muito ineficiente e caro para cordas grandes.

É melhor fazer

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)

Um objecto buffer mantém uma referência ao texto original e aos atributos start e length. Desta forma, não se verifica qualquer duplicação desnecessária de dados.

Uma cadeia de comprimento l tem l*l/2 sub cadeias de comprimento médio l/2, de modo que o consumo de memória seria aproximadamente l*l*l/4. Com um amortecedor, é muito menor.

Note que buffer() apenas existe em 2.X. 3.x has memoryview(), que é utilizado ligeiramente diferente.

Ainda melhor seria calcular os índices e cortar a sub-estrutura a pedido.
 13
Author: glglgl, 2012-07-01 18:34:27

Se tiver um MemoryError inesperado e achar que deve ter muita RAM disponível, pode ser porque está a usar uma instalação python de 32 bits.

A solução fácil, se você tem um sistema operacional de 64 bits, é mudar para uma instalação de 64 bits do python.

O problema é que python de 32 bits só tem acesso a ~4GB de RAM. Isto pode encolher ainda mais se o seu sistema operacional é 32-bit, por causa do sistema operacional acima.

Você pode aprender mais sobre a razão pela qual os sistemas operativos de 32 bits estão limitados a ~4GB de RAM aqui: https://superuser.com/questions/372881/is-there-a-technical-reason-why-32-bit-windows-is-limited-to-4gb-of-ram

 16
Author: mgoldwasser, 2017-03-20 10:04:24

Um erro de memória significa que o seu programa ficou sem memória. Isso significa que seu programa de alguma forma cria muitos objetos.

No seu exemplo, tem de procurar partes do seu algoritmo que possam consumir muita memória. Suspeito que o seu programa recebe cordas muito longas como entradas. Portanto, s[i:j+1] pode ser o culpado, uma vez que cria uma nova lista. A primeira vez que você usá-lo no entanto, não é necessário porque você não usa a lista criada. Podias ... tente ver se o seguinte ajuda:
if  j + 1 < a:
    sub_strings.append(s[i:j+1])

Para substituir a criação da segunda lista, deve usar definitivamente um objecto buffer , como sugerido por glglgl .

Note também que, uma vez que utiliza if j >= i:, não precisa de iniciar o seu xrange a 0. Você pode ter:

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

Uma alternativa mais radical seria tentar refazer o seu algoritmo para que você não pre-compute todas as sub-strings possíveis. Em vez disso, você poderia simplesmente computar a substring que é pedida.

 5
Author: Rodrigue, 2017-05-23 12:03:05

Usar o python 64 bit resolve muitos problemas.

 0
Author: Rajeev Kallur, 2015-06-25 05:06:12

Você poderá tentar criar o mesmo programa que aparece com erros, dividindo o programa em vários programas, importando a partir de programas externos. Exemplo, hello.py esperar um erro de erro de Memória, então eu dividir hello.py em vários scripts h.py e.py ll.py o.py todos eles têm de entrar em uma pasta "hellohello" dentro dessa pasta crie init.py em init escrever importar h,e,ll,o e, em seguida, ide escrever importar hellohello

 -1
Author: joshua, 2014-08-15 21:51:16