Отображение памяти повторно использует функциональные возможности виртуальной памяти операционной системы, чтобы использовать существующий файл в качестве резервного источника для диапазона адресуемой памяти.
В одном процессе не будет обязательно сохранять память.Вместо этого он просто:
Задержки загрузки любого диапазона адресов в ОЗУ, оставляя его на диске до запроса.Если он никогда не запрашивается, тогда ОЗУ никогда не используется, поэтому в этом конкретном случае он может «сохранить» память.
Позволяет этим загруженным диапазонам быть дешево сброшенными, еслик ним некоторое время не обращаются, и ОЗУ требуется для других распределений - потому что эти диапазоны могут быть перезагружены по требованию с диска, если потребуется снова.Таким образом, в этом случае он может «сохранить» память по сравнению с исчерпанием ОЗУ или активацией другой общей виртуальной памяти, которая не знает о соотношении 1: 1 с существующим дисковым файлом.(Без отображения памяти редко используемые диапазоны материала в ОЗУ могут быть записаны в отдельный файл подкачки, чтобы освободить место для других выделений - что является расточительной операцией и избыточными данными, когда данные уже существуют где-то на диске.)
К сожалению, в общем случае одного процесса и типичных операций, таких как most_similar()
, который обязательно вычисляется для каждого отдельного вектора, вся структура будет помещена в память каждогоmost_similar()
.Там нет чистой «экономии» ОЗУ (хотя, возможно, небольшое преимущество ЦП / ввода-вывода, если бы другое давление памяти вынудило бы выгружать загруженные диапазоны).(Какой бы подход вы ни использовали, значения «~ 2,2 ГБ» и «~ 1,2 ГБ» используемой оперативной памяти могут неправильно измерять это.)
Основное преимущество заключается в использовании нескольких процессов, каждый из которых нуждаетсяпросмотреть данные того же файла.При наивной загрузке в ОЗУ каждый процесс будет иметь свою собственную избыточную копию тех же данных.Если вы используете отображение памяти, вы даете знать ОС: эти несколько массивов в адресном пространстве, в нескольких отдельных обработанных, определенно имеют одни и те же данные (как отражено в файле).Независимо от того, скольким процессам нужны данные, только одна копия каждого диапазона файлов будет занимать ОЗУ.Там можно добиться большой экономии.