редактировать: Использование Win10 и питона 3,5Python, почему mmap.move() заполняет память?
У меня есть функция, которая использует ММАП удалить байты из файла в определенном смещении:
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()
Он работает очень быстро, но когда я запускаю его на большое количество файлов, память быстро заполняется, и моя система становится невосприимчивой.
После некоторых экспериментов я обнаружил, что метод move() был виновником здесь и, в частности, количеством перемещаемых данных (move_size). Объем используемой памяти эквивалентен общему количеству перемещаемых данных mmap.move()
. Если у меня есть 100 файлов с перемещением ~ 30 МБ, память заполняется ~ 3 ГБ.
Почему данные не перемещаются из памяти?
Вещи я пытался, которые не имели никакого эффекта:
- призывающие
gc.collect()
в конце функции. - переписывание функции для перемещения в небольших кусках.
В какой операционной системе вы используете? Версия Python. – wind85
Можете ли вы также проверить, используется ли память вашим процессом python или операционной системой? – Leon
Извините, забыли упомянуть: я на Win10 и python 3.5. Как проверить, используется ли память для python или ОС? – mahkitah