Ich bin völlig verwirrt über die Speichernutzung eines bestimmten Python-Skripts. Ich denke, ich weiß nicht wirklich, wie man die Verwendung trotz advice von einigen SO Fragen/Answers profilieren kann.Speicherauslastung in Python: Was ist der Unterschied zwischen memory_profiler und Guppy?
Meine Fragen sind: Was ist der Unterschied zwischen memory_profiler
und guppy.hpy
? Warum sagt mir jemand, dass ich große Mengen an Speicher verwende, und der andere sagt mir, dass ich nicht bin?
Ich arbeite mit pysam
, eine Bibliothek für den Zugriff auf Bioinformatik SAM/BAM-Dateien. Mein Hauptskript läuft nicht schnell genug, wenn SAM (ASCII) in BAM (Binary) konvertiert wird und die Dateien dazwischen manipuliert werden.
Ich habe ein kleines Testbeispiel erstellt, um zu verstehen, wie viel Speicher bei jedem Schritt zugewiesen wird.
# 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)
Überwachung der Speichernutzung mit memory_profiler (python -m memory_profiler test_pysam.py
) ergibt die folgende Ausgabe:
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
Dann @profile
Dekorateur kommentieren und uncommenting die guppy
bezogenen Linien, erhalte ich die folgende Ausgabe (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
Die Gesamtgröße der Zeile 13 beträgt in einem Fall 529,03 MB und 624 Bytes in der anderen. Was ist hier eigentlich los? 'test.sam' ist eine ~ 52MB SAM Datei (wieder ein ASCII Format). Es ist ein bisschen schwierig für mich, tief in pysam
zu graben, da es ein Wrapper um eine C-Bibliothek ist, die sich auf samtools
bezieht. Unabhängig davon, was eine Samfile
eigentlich ist, sollte ich in der Lage sein zu lernen, wie viel Speicher zugeordnet ist, um es zu erstellen. Welche Prozedur sollte ich verwenden, um die Speicherauslastung jedes Schritts meines größeren, komplexeren Python-Programms korrekt zu profilieren?
Beachten Sie, dass "test.sam" in einer zweiten Zeile ist, weil es ein viel längerer Name war und sobald ich es änderte, merkte ich, dass meine Zeilennummer aus wäre, wenn ich den Dateinamen auf eine Zeile setzen würde. – Yann