memoryerror - python memory error windows
error de memoria en python (5)
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
Los errores anteriores aparecieron cuando intenté ejecutar el siguiente programa. ¿Alguien puede explicar qué es un error de memoria y cómo superar este problema? . El programa toma cadenas como entrada y encuentra todas las cadenas secundarias posibles y crea un conjunto (en un orden lexicográfico) a partir de él y debe imprimir el valor en el índice respectivo solicitado por el usuario; de lo contrario, debería imprimir ''No vá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()
Este de aquí:
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 muy ineficiente y costoso para cuerdas grandes.
Mejor hacer
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)
Un objeto de búfer mantiene una referencia a la cadena original y los atributos de inicio y longitud. De esta manera, no se produce duplicación innecesaria de datos.
Una cadena de longitud l
tiene l*l/2
subcadenas de longitud media l/2
, por lo que el consumo de memoria sería aproximadamente l*l*l/4
. Con un buffer, es mucho más pequeño.
Tenga en cuenta que el buffer()
sólo existe en 2.x. 3.x tiene memoryview()
, que se utiliza ligeramente diferente.
Aún mejor sería calcular los índices y recortar la subcadena a pedido.
Si obtiene un MemoryError
inesperado y cree que debería tener suficiente memoria RAM disponible, podría deberse a que está utilizando una instalación de python de 32 bits.
La solución fácil, si tiene un sistema operativo de 64 bits, es cambiar a una instalación de python de 64 bits.
El problema es que python de 32 bits solo tiene acceso a ~ 4 GB de RAM. Esto puede reducirse aún más si su sistema operativo es de 32 bits, debido a la sobrecarga del sistema operativo.
Puede obtener más información sobre por qué los sistemas operativos de 32 bits se limitan a ~ 4 GB de RAM aquí: https://superuser.com/questions/372881/is-there-a-technical-reason-why-32-bit-windows-is-limited-to-4gb-of-ram
Un error de memoria significa que su programa se ha quedado sin memoria. Esto significa que su programa de alguna manera crea demasiados objetos.
En su ejemplo, debe buscar partes de su algoritmo que podrían estar consumiendo mucha memoria. Sospecho que su programa tiene cadenas muy largas como entradas. Por lo tanto, s[i:j+1]
podría ser el culpable, ya que crea una nueva lista. Sin embargo, la primera vez que lo use, no es necesario porque no usa la lista creada. Podrías intentar ver si lo siguiente ayuda:
if j + 1 < a:
sub_strings.append(s[i:j+1])
Para reemplazar la creación de la segunda lista, definitivamente debe usar un objeto de buffer , como lo sugiere glglgl .
También tenga en cuenta que dado que usa if j >= i:
no necesita iniciar su xrange
de xrange
en 0. Puede tener:
for i in xrange(0, a):
for j in xrange(i, a):
# No need for if j >= i
Una alternativa más radical sería tratar de volver a trabajar su algoritmo para que no realice un cálculo previo de todas las sub-cadenas posibles. En su lugar, simplemente podría calcular la subcadena que se solicita.
Usar Python de 64 bits resuelve muchos problemas.
podría intentar crear el mismo script que hace aparecer ese error, dividiendo el script en varios scripts importando desde un script externo. Por ejemplo, hello.py espera un error. Error de memoria, por lo tanto, divido hello.py en varios scripts h.py e.py ll.py o.py, todos ellos deben ingresar a una carpeta "hellohello" en esa carpeta create init . ingrese en init write import h, e, ll, o, y luego en ide, escriba import hellohello