Можно ли закрыть временный файл memmap без очистки его содержимого?

Вариант использования: огромная обработка изображений. Я использую временные файлы mem-mapped, когда набор данных intermeditate превышает физическую память. Мне не нужно сохранять промежуточные результаты на диск после того, как я закончу с ними. Когда я их удаляю, numpy сначала записывает все их содержимое на диск, а затем удаляет файл из файловой системы. Сброс облагает налогом ресурсы ввода-вывода и файловую систему, что, на мой взгляд, логически не нужно, поскольку файл впоследствии просто удаляется.

Можно ли закрыть временный файл memmap без очистки его содержимого?

1 ответ

Решение

Вам нужно открыть карту памяти как копию при записи, с c Режим. От numpy.memmap документация:

mode : {'r+', 'r', 'w+', 'c'}, optional

Файл открывается в этом режиме:

'r'     Open existing file for reading only.
'r+'    Open existing file for reading and writing.
'w+'    Create or overwrite existing file for reading and writing.
'c'     Copy-on-write: assignments affect data in memory, but changes 
        are not saved to disk. The file on disk is read-only.

По умолчанию 'r+',

Таким образом, по умолчанию разрешено чтение и запись, но изменение файла, отображенного в памяти таким образом, действительно приведет к обратной записи всех изменений. Промывка изменений может произойти в любое время, но при закрытии она обязательно произойдет.

Когда вы используете c в качестве режима изменения приведут к копированию измененной страницы (прозрачно), и затронутые таким образом страницы снова будут удалены при закрытии файла.

Обратите внимание, что когда вы пишете на достаточное количество страниц, ОС придется переставлять страницы памяти на диск. Это ничем не отличается от любого другого процесса, использующего больше памяти, чем доступно. Когда вы закрываете файл mmapped, все такие скопированные страницы (перенесенные на диск или все еще находящиеся в памяти) снова удаляются.

Другие вопросы по тегам