edit: Usando Win10 e pitone 3.5Python, perché mmap.move() riempie la memoria?
Ho una funzione che usa mmap per rimuovere i byte da un file ad un certo 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()
E funziona super veloce, ma quando l'eseguo su un un numero elevato di file, la memoria si riempie rapidamente e il mio sistema non risponde.
Dopo alcuni esperimenti, ho scoperto che il metodo move() era il colpevole qui, e in particolare la quantità di dati spostati (move_size). La quantità di memoria utilizzata è equivalente alla quantità totale di dati spostati da mmap.move()
. Se ho 100 file con ogni ~ 30 MB spostati, la memoria viene riempita con ~ 3 GB.
Perché i dati spostati non vengono rilasciati dalla memoria?
cose che ho provato che non aveva alcun effetto:
- chiamando
gc.collect()
al termine della funzione. - riscrivere la funzione per spostarsi in piccoli blocchi.
Quale sistema operativo utilizzate? Anche la versione Python. – wind85
Puoi verificare anche se la memoria è utilizzata dal tuo processo Python o dal sistema operativo? – Leon
Scusa, ho dimenticato di menzionare: Sono su Win10 e Python 3.5. Come posso controllare se la memoria è usata da Python o dal SO? – mahkitah