Estoy completamente confundido sobre el uso de memoria de un script python específico. Supongo que realmente no sé cómo perfilar el uso a pesar de advice de varias SO Questions/Answers.Uso de la memoria en Python: ¿Cuál es la diferencia entre memory_profiler y guppy?
Mis preguntas son: ¿Cuál es la diferencia entre memory_profiler
y guppy.hpy
? ¿Por qué uno me dice que estoy usando una gran cantidad de memoria y el otro me está diciendo que no?
Estoy trabajando con pysam
, una biblioteca para acceder a los archivos SAM/BAM bioinformáticos. Mi script principal se está quedando sin memoria rápidamente al convertir SAM (ASCII) a BAM (Binario) y manipular los archivos intermedios.
Creé un pequeño ejemplo de prueba para comprender cuánta memoria se asigna en cada paso.
# test_pysam.py:
import pysam
#from guppy import hpy
TESTFILENAME = ('/projectnb/scv/yannpaul/MAR_CEJ082/' +
'test.sam')
#H = hpy()
@profile # for memory_profiler
def samopen(filename):
# H.setrelheap()
samf = pysam.Samfile(filename)
# print H.heap()
pass
if __name__ == "__main__":
samopen(TESTFILENAME)
Supervisión del uso de la memoria con memory_profiler (python -m memory_profiler test_pysam.py
) da como resultado el siguiente resultado:
Filename: test_pysam.py
Line # Mem usage Increment Line Contents
================================================
10 @profile # for memory_profiler
11 def samopen(filename):
12 10.48 MB 0.00 MB # print H.setrelheap()
13 539.51 MB 529.03 MB samf = pysam.Samfile(filename)
14 # print H.heap()
15 539.51 MB 0.00 MB pass
Entonces comentando @profile
decorador y eliminando el comentario de los guppy
líneas relacionadas, me sale el siguiente resultado (python test_pysam.py
):
Partition of a set of 3 objects. Total size = 624 bytes.
Index Count % Size % Cumulative % Kind (class/dict of class)
0 1 33 448 72 448 72 types.FrameType
1 1 33 88 14 536 86 __builtin__.weakref
2 1 33 88 14 624 100 csamtools.Samfile
El tamaño total de la línea 13 es de 529.03 MB en un caso y 624 bytes en el otro. ¿Qué está pasando realmente aquí? 'test.sam' es un archivo ~ 52MB SAM (de nuevo un formato ASCII). Es un poco complicado para mí profundizar en pysam
, ya que es un contenedor de una biblioteca de C relacionada con samtools
. Independientemente de lo que realmente sea un Samfile
, creo que debería ser capaz de aprender cuánta memoria se asigna para crearlo. ¿Qué procedimiento debo usar para perfilar correctamente el uso de la memoria de cada paso de mi programa python más grande y complejo?
Tenga en cuenta que 'test.sam' está en una segunda línea porque era un nombre mucho más largo y una vez que lo cambié me di cuenta de que la información de mi número de línea estaría desactivada si pongo el nombre de archivo en una línea. – Yann