¿La configuración de arrays numpy a Ninguna memoria libre?

Tengo cientos de matrices realmente grandes, como las de (600, 800) o (3, 600, 800).

Por lo tanto, quiero desasignar la memoria utilizada tan pronto como ya no necesite algo.

Pensé:

some_matrix = None 

¿Debería hacer el trabajo o solo la referencia está establecida en Ninguna, pero en algún lugar de la Memoria el espacio aún está asignado? (como conservar el espacio asignado para alguna reinicialización de some_matrix en el futuro)

Además: a veces estoy dividiendo las matrices, calculé algo y puse los valores en un búfer (una lista, porque se adjunta todo el tiempo). Así que establecer una lista en Ninguno definitivamente liberará la memoria, ¿verdad?

¿O existe algún tipo de método unset() se “eliminan” los identificadores completos más sus objetos referenciados?

Definitivamente quieres echar un vistazo a la recolección de basura . A diferencia de algunos lenguajes de progtwigción como C/C++ donde el progtwigdor tiene que liberar la memoria asignada de forma dinámica por sí mismo cuando el espacio ya no es necesario, Python tiene una recolección de basura. Lo que significa que Python libera la memoria cuando es necessary .

Cuando usa some_matrix = None , desvincula la variable del espacio de memoria; el contador de referencia disminuye y, si llega a 0 , el recolector de basura liberará la memoria. Cuando utiliza del some_matrix como lo sugiere MSeifert, la memoria no se libera de inmediato en contra de lo que dice la respuesta. Según python doc , esto es lo que sucede:

La eliminación de un nombre elimina el enlace de ese nombre del espacio de nombres local o global

Lo que sucedió bajo el capó es que el contador de referencias al espacio de memoria se reduce en 1 independientemente de la asignación de None o el uso de del . Cuando este contador llegue a 0 , el recolector de basura free el espacio de memoria en el futuro. La única diferencia es que al usar del , queda claro en el contexto que ya no necesita el nombre.

Si observa el documento de la recolección de basura, verá que puede invocarlo usted mismo o cambiar algunos de sus parámetros.

Numpy elimina matrices cuando el contador de referencia es cero (o al menos hace un seguimiento del contador de referencia y permite que el sistema operativo recoja la basura).

Por ejemplo, tener

 import numpy as np a = np.linspace(0,100, 10000000) a = None 

liberará la memoria “inmediatamente” (la forma preferida es escribir del a ), mientras que

 import numpy as np a = np.linspace(0,100, 10000000) b = a a = None 

no liberará nada.


Usted mencionó también rebanar. Cortar es solo una vista de los datos y, por lo tanto, exactamente como el segundo ejemplo. Si no elimina ambas variables que hacen referencia a la misma matriz, el sistema operativo mantendrá las matrices.

Si hago algo muy caro, siempre me quedo con funciones separadas que hacen la operación y solo devuelven lo que es realmente necesario. Las funciones se limpian después de sí mismas para que los resultados intermedios se liberen (si no se devuelven).