Se dice que Python administra automáticamente la memoria. Estoy confundido porque tengo un programa de Python que consistentemente usa más de 2GB de memoria.¿Cómo escribir un programa Python eficiente en memoria?
Es un descargador y desempaquetador de datos binarios de varios hilos.
def GetData(url):
req = urllib2.Request(url)
response = urllib2.urlopen(req)
data = response.read() // data size is about 15MB
response.close()
count = struct.unpack("!I", data[:4])
for i in range(0, count):
UNPACK FIXED LENGTH OF BINARY DATA HERE
yield (field1, field2, field3)
class MyThread(threading.Thread):
def __init__(self, total, daterange, tickers):
threading.Thread.__init__(self)
def stop(self):
self._Thread__stop()
def run(self):
GET URL FOR EACH REQUEST
data = []
items = GetData(url)
for item in items:
data.append(';'.join(item))
f = open(filename, 'w')
f.write(os.linesep.join(data))
f.close()
Se están ejecutando 15 subprocesos. Cada solicitud obtiene 15MB de datos y los descomprime y guarda en un archivo de texto local. ¿Cómo podría este programa consumir más de 2GB de memoria? ¿Necesito hacer trabajos de reciclaje de memoria en este caso? ¿Cómo puedo ver cuánta memoria usan cada objeto o función?
Agradecería todos sus consejos o sugerencias sobre cómo mantener un programa de python ejecutándose en un modo de memoria eficiente.
Editar: Aquí está la salida de "cat/proc/meminfo"
MemTotal: 7975216 kB
MemFree: 732368 kB
Buffers: 38032 kB
Cached: 4365664 kB
SwapCached: 14016 kB
Active: 2182264 kB
Inactive: 4836612 kB
primera pregunta sería: ¿Cuánta memoria física tiene disponible? Simplemente podría ser que Python decide que no vale la pena limpiar porque de todos modos todavía hay 1GB de memoria física libre. –
Pruebe el uso de la memoria de creación de perfiles: http://stackoverflow.com/questions/110259/python-memory-profiler – outis
@Matthew, Parece que solo hay 730 MB de 8 GB de RAM disponibles. – jack