Я пытаюсь обработать ~ 20 ГБ данных в системе Ubuntu с 64 ГБ ОЗУ.
Этот шаг является частью некоторых этапов предварительной обработки для генерации векторов элементов для обучения ML al go.
В исходной реализации (написанной кем-то из моей команды) были списки , Это не хорошо масштабируется, так как мы добавляем больше обучающих данных. Это что-то вроде этого.
all_files = glob("./Data/*.*")
file_ls = []
for fi in tqdm(all_files):
with open(file=fi, mode="r", encoding='utf-8', errors='ignore') as f:
file_ls.append(f.read())
Это приводит к ошибке памяти (процесс прерывается). Поэтому я решил попробовать заменить список на основе попыток
def insert(word):
cur_node = trie_root
for letter in word:
if letter in cur_node:
cur_node = cur_node[letter]
else:
cur_node[letter] = {}
cur_node = cur_node[letter]
cur_node[None] = None
trie_root = {}
for fi in tqdm(all_files):
with open(file=fi, mode="r", encoding='utf-8', errors='ignore') as f:
insert(f.read().split())
Это тоже будет убито. Выше приведен демонстрационный код, который я написал для захвата памяти объектов. Хуже всего то, что демонстрационный код для списка работает автономно, но демонстрационный код для tr ie убивается, что заставляет меня поверить, что эта реализация хуже, чем реализация списка.
Моя цель - написать эффективный код на Python для решения этой проблемы.
Пожалуйста, помогите мне решить эту проблему.
РЕДАКТИРОВАТЬ: Отвечая @Paul Hankin, обработка данных включает в себя сначала взятие каждого файла и добавление обобщенного c заполнителя для терминов с нормализованным термином частота больше 0,01, после чего каждый файл разбивается на список и вычисляется словарь с учетом всех обработанных файлов.