Почему флаг mmap снижает потребление памяти для одного экземпляра Word2Vec - PullRequest
0 голосов
/ 21 мая 2019

Согласно документам и википедии:

mmap позволяет процессам использовать один и тот же кусок памяти.

word_vectors = KeyedVectors.load(config.get(wv_file))

Эта модель загружается следующим образом: ~ 2,2 ГБ ОЗУ

word_vectors = KeyedVectors.load(config.get(wv_file), mmap='r')

Эта модель загружается так, как это занимает ~ 1,2 ГБ ОЗУ

Почему я наблюдаю такое резкое снижение потребления барана?

Загрузка нескольких моделей одновременно, работает как положено, и модели совместно используют ~ 1 ГМ памяти.

1 Ответ

1 голос
/ 21 мая 2019

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

В одном процессе не будет обязательно сохранять память.Вместо этого он просто:

  • Задержки загрузки любого диапазона адресов в ОЗУ, оставляя его на диске до запроса.Если он никогда не запрашивается, тогда ОЗУ никогда не используется, поэтому в этом конкретном случае он может «сохранить» память.

  • Позволяет этим загруженным диапазонам быть дешево сброшенными, еслик ним некоторое время не обращаются, и ОЗУ требуется для других распределений - потому что эти диапазоны могут быть перезагружены по требованию с диска, если потребуется снова.Таким образом, в этом случае он может «сохранить» память по сравнению с исчерпанием ОЗУ или активацией другой общей виртуальной памяти, которая не знает о соотношении 1: 1 с существующим дисковым файлом.(Без отображения памяти редко используемые диапазоны материала в ОЗУ могут быть записаны в отдельный файл подкачки, чтобы освободить место для других выделений - что является расточительной операцией и избыточными данными, когда данные уже существуют где-то на диске.)

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

Основное преимущество заключается в использовании нескольких процессов, каждый из которых нуждаетсяпросмотреть данные того же файла.При наивной загрузке в ОЗУ каждый процесс будет иметь свою собственную избыточную копию тех же данных.Если вы используете отображение памяти, вы даете знать ОС: эти несколько массивов в адресном пространстве, в нескольких отдельных обработанных, определенно имеют одни и те же данные (как отражено в файле).Независимо от того, скольким процессам нужны данные, только одна копия каждого диапазона файлов будет занимать ОЗУ.Там можно добиться большой экономии.

...