У меня есть словарь, похожий на следующий в python.
a = {'D1' : array([1, 2, 3]),
'D2' : array([5,2,3]),
...
}
Я хочу сохранить этот словарь в tsv-файле. Мне известно о библиотеке pickle, но в настоящее время я не могу ее использовать, потому что еще до того, как я начал создавать этот словарь, объем моей памяти составляет примерно 3 ГБ. После создания этого словаря занятость памяти составляет 6,5-7 ГБ из 8 ГБ оперативной памяти на моем устройстве. Когда я пытаюсь сохранить этот словарь, используя pickle.dump
, моя память переполняется, и ядро умирает.
Я не знаю ни одного инструмента, который может динамически хранить пары ключ-значение в файле во вторичной памяти. Следующий код - это мой исходный код, он даст больше информации.
import pickle
f = open('wordvecs.pickle', 'rb')
a = pickle.load(f)
Теперь, когда я загружаю этот файл, память 3 ГБ занимает из 8 ГБ. Теперь, используя этот словарь a
, я создаю другой словарь с именем doc_vecs
следующим образом:
from nltk.corpus import stopwords
from tqdm import tqdm
import math
stop_words = set(stopwords.words('english'))
doc_vecs = {}
f1 = open("preprocessed_corpus.tsv", "rt")
f2 = open('doc_vecs.tsv', 'wt')
for i in tqdm(list(range(3213833))):
docid, url, title, content = f1.readline().split('\t')
line = title + " " + content
v = np.mean(np.array([a[key] for key in line.split() if key in a and key not in stop_words]), axis=0)
if(type(v) == np.float64 and math.isnan(v)):
continue
doc_vecs[docid] = v
seek_posn = f1.tell()
В конце сохраняю словарь в файле f2
.
pickle.dump(doc_vecs, f2)
После выполнения этой части моя память почти заполнена, и когда я пытаюсь сохранить словарь doc_vecs
с помощью pickle, мое ядро умирает. Есть ли здесь какой-нибудь вариант? Я хотел бы знать, могу ли я сохранить словарь строковых ключей и значения массива numpy в txt, tsv или файле pickle.
Я также пытался освободить больше памяти, удалив a
после того, как doc_vecs
был построен с использованием del a
, но я не знаю, почему он не освобождает память. Я также использовал gc.collect()
, чтобы быть уверенным, что любая переменная, на которую нет ссылки, не занимает никакой памяти.