Не хватает оперативной памяти

Рейтинг: 0Ответов: 1Опубликовано: 21.03.2023

Необходимо загрузить файл, который весит около 16 ГБ в оперативную память (в дальнейшем, нужные данные оттуда считаю и вставлю в обычный текстовый файл, но это уже другая история). Делаю я это с помощью следующей команды:

import gensim

w2v_fpath = "all.norm-sz500-w10-cb0-it3-min5.w2v"
w2v = gensim.models.KeyedVectors.load_word2vec_format(w2v_fpath, binary=True, unicode_errors='ignore')
w2v.init_sims(replace=True)
for word, score in w2v.most_similar(u"дерево"):
    print word, score

(взято с https://nlpub.ru/Russian_Distributional_Thesaurus?ysclid=lfhz42q3an380561492)

На моём компьютере 16 ГБ оперативной памяти + я задал 20 ГБ файла подкачки. Тем не менее, после того, как оперативная память достигает своего максимума (а именно, 16 ГБ), компьютер намертво зависает (смотрю это через "Диспетчер задач" -> "Производительность" -> "Память"). Код запускаю через jupyter notebook, работаю на Windows 10.

P.S. Выдержка с сайта

Системные требования для комфортной работы с векторами слов Всего модель содержит более 7 миллионов векторов размерности 500 измерений, поэтому для загрузки модели в память мы рекомендуем использовать компьютер с как минимум 24 Гб оперативной памяти (модель занимает 17-19 Гб оперативной памяти, но работа возможна и с 16 Гб оперативной памяти при наличии файла подкачки достаточного объема). Общее время загрузки полной модели составляет около 200-240 секунд, модель занимает около 17-19 Гб оперативной памяти.

Ответы

▲ 1Принят

Можно попробовать урезать тип векторов, по умолчанию он np.float32 согласно документации:

Word2Vec.load_word2vec_format(fname, fvocab=None, binary=False, encoding='utf8', unicode_errors='strict', limit=None, datatype=<type 'numpy.float32'>)

Можно задать вручную тип np.float16, вектора станут менее точными, но зато памяти теоретически понадобится в 2 раза меньше:

import numpy as np

w2v = gensim.models.KeyedVectors.load_word2vec_format(w2v_fpath, 
    binary=True, unicode_errors='ignore', datatype=np.float16)
                                        ^^^^^^^^^^^^^^^^^^^^^

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

datatype (experimental) can coerce dimensions to a non-default float type (such as np.float16) to save memory. (Such types may result in much slower bulk operations or incompatibility with optimized routines.)

Есть ещё параметр limit, он ограничивает число читаемых из файла векторов, но это лотерея - возможно, нужные вам вектора идут в начале файла, а возможно и в конце, тут как повезёт.