bearbeiten: Verwenden von Win10 und Python 3.5Python, warum füllt mmap.move() den Speicher auf?
ich eine Funktion haben, die mmap verwendet Bytes aus einer Datei zu einem bestimmten entfernen Offset:
def delete_bytes(fobj, offset, size):
fobj.seek(0, 2)
filesize = fobj.tell()
move_size = filesize - offset - size
fobj.flush()
file_map = mmap.mmap(fobj.fileno(), filesize)
file_map.move(offset, offset + size, move_size)
file_map.close()
fobj.truncate(filesize - size)
fobj.flush()
Es super schnell funktioniert, aber wenn ich es auf eine Flucht große Anzahl von Dateien, der Speicher füllt sich schnell und mein System reagiert nicht mehr.
Nach einigen Experimenten habe ich festgestellt, dass die move() -Methode hier die Ursache war, und insbesondere die Menge der zu verschiebenden Daten (move_size). Die Menge des verwendeten Speichers entspricht der Gesamtmenge der Daten, die von mmap.move()
verschoben werden. Wenn ich 100 Dateien mit je ~ 30 MB verschoben habe, wird der Speicher mit ~ 3GB gefüllt.
Warum werden die verschobenen Daten nicht aus dem Speicher freigegeben?
Dinge, die ich versuchte, die keine Wirkung hatte:
gc.collect()
am Ende der Funktion aufrufen.- die Funktion umschreiben, um sich in kleine Stücke zu bewegen.
Welches Betriebssystem verwenden Sie? Python-Version auch. – wind85
Können Sie bitte auch überprüfen, ob der Speicher von Ihrem Python-Prozess oder vom Betriebssystem verwendet wird? – Leon
Sorry, habe vergessen zu erwähnen: Ich bin auf Win10 und Python 3.5. Wie überprüfe ich, ob der Speicher von Python oder OS verwendet wird? – mahkitah