try - python solve memory error
Errores de memoria y lĂmites de lista? (4)
Necesito producir matrices grandes y grandes (muy) (cadenas de Markov) para fines científicos. Realizo el cálculo que puse en una lista de 20301 elementos (= una fila de mi matriz). Necesito todos esos datos en la memoria para proceder al siguiente paso de Markov, pero puedo almacenarlos en otro lugar (por ejemplo, archivo) si es necesario, incluso si va a ralentizar mi cadena de Markov. Mi computadora (laboratorio científico): Bi-xenon 6 núcleos / 12 hilos cada uno, 12GB de memoria, sistema operativo: win64
Traceback (most recent call last):
File "my_file.py", line 247, in <module>
ListTemp.append(calculus)
MemoryError
Ejemplo de resultados de cálculo: 9.233747520008198e-102 (sí, es más de 1/9000)
El error se produce cuando se almacena el elemento 19766:
ListTemp[19766]
1.4509421012263216e-103
Si voy más allá
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
ListTemp[19767]
IndexError: list index out of range
Entonces esta lista tenía un error de memoria en el ciclo 19767.
Preguntas:
¿Hay un límite de memoria en una lista? ¿Es un "límite por lista" o un "límite global por guión"?
¿Cómo pasar por alto esos límites? ¿Alguna posibilidad en mente?
¿Ayudará usar numpy, python64? ¿Cuáles son los límites de memoria con ellos? ¿Qué hay de otros idiomas?
La excepción MemoryError
que está viendo es el resultado directo de quedarse sin RAM disponible. Esto podría deberse al límite de 2 GB por programa impuesto por Windows ( programas de 32 bits ) o a la falta de RAM disponible en su computadora. (Este link es a una pregunta anterior).
Debería poder ampliar los 2 GB utilizando una copia de 64 bits de Python, siempre que esté utilizando una copia de 64 bits de Windows.
IndexError
se debe a que Python golpeó la excepción MemoryError
antes de calcular toda la matriz. De nuevo, esto es un problema de memoria.
Para evitar este problema, podría tratar de usar una copia de 64 bits de Python o, mejor aún, encontrar la manera de escribir sus resultados en el archivo. Para ello, observe las matrices mapeadas de memoria de numpy.
Debería poder ejecutar todo el conjunto de cálculos en una de estas matrices ya que los datos reales se escribirán en el disco, y solo una pequeña parte se mantendrá en la memoria.
No hay límite de memoria impuesto por Python. Sin embargo, obtendrá un MemoryError
si se queda sin RAM. dices que tienes 20301 elementos en la list
. Esto parece demasiado pequeño para causar un error de memoria para tipos de datos simples (por ejemplo, int
), pero si cada elemento en sí es un objeto que ocupa mucha memoria, es posible que se esté quedando sin memoria.
IndexError
embargo, el IndexError
probablemente se deba a que su ListTemp
solo tiene 19767 elementos (indexados de 0 a 19766), y usted está tratando de acceder más allá del último elemento.
Es difícil decir qué puedes hacer para evitar llegar al límite sin saber exactamente qué es lo que intentas hacer. Usar numpy
podría ayudar. Parece que está almacenando una gran cantidad de datos. Es posible que no necesite almacenarlo en todas las etapas. Pero es imposible decir sin saber.
Primero, mira ¿Cuán grande puede ser una matriz de Python? y Numpy, problema con arreglos largos
En segundo lugar, el único límite real proviene de la cantidad de memoria que tiene y cómo su sistema almacena referencias de memoria. No hay límite por lista, por lo que Python continuará hasta que se quede sin memoria. Dos posibilidades:
- Si está ejecutando un sistema operativo anterior o uno que obliga a los procesos a utilizar una cantidad limitada de memoria, es posible que necesite aumentar la cantidad de memoria a la que tiene acceso el proceso de Python.
- Divida la lista usando fragmentación. Por ejemplo, haga los primeros 1000 elementos de la lista, agréguelos y guárdelos en el disco, y luego haga los siguientes 1000. Para trabajar con ellos, desatornille un trozo a la vez para que no se quede sin memoria. Esta es esencialmente la misma técnica que utilizan las bases de datos para trabajar con más datos de los que caben en la memoria RAM.
Si desea eludir este problema, también puede usar el estante. Luego, crearía archivos que serían del tamaño de la capacidad de su máquina para manejarlos, y solo los colocaría en la memoria RAM cuando sea necesario, básicamente escribiendo en HD y recortando la información en pedazos para que pueda procesarla.
Cree un archivo binario y compruebe si ya hay información en él, si es así, haga una variable local para contenerlo; de lo contrario, escriba algunos datos que considere necesarios.
Data = shelve.open(''File01'')
for i in range(0,100):
Matrix_Shelve = ''Matrix'' + str(i)
if Matrix_Shelve in Data:
Matrix_local = Data[Matrix_Shelve]
else:
Data[Matrix_Selve] = ''somenthingforlater''
Espero que no suene demasiado arcaico.