Как сохранить словарь строковых ключей и numpy значений массива в файле tsv? - PullRequest
0 голосов
/ 05 мая 2020

У меня есть словарь, похожий на следующий в 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(), чтобы быть уверенным, что любая переменная, на которую нет ссылки, не занимает никакой памяти.

...