Как исправить ограничение ОЗУ, превращая длинный журнал DEAP (10 ММ) в информационный блок в Colab? - PullRequest
1 голос
/ 02 июля 2019

При преобразовании журнала DEAP (по сути, списка словарей) с примерно 10-миллионными записями в Dataframe для дальнейшей обработки я получил сообщение о переполнении ОЗУ в Google Colab.

Я использую пакет DEAP для некоторых экспериментов, так как моя машина медленная и старая, я помогаю себе с сервисом Colab от Google. Результатом симуляции является журнал DEAP, это список словарей. Каждый словарь представляет собой сводку важных значений скриншота симуляции. Я превратил этот список словарей в Dataframes для анализа, но для самых больших симуляций процесс завершается сбоем из-за превышения выделенной оперативной памяти.

В словарях хранятся такие значения:

logbook[-1]
{'avg': 16.72180244532359,
 'b_ratio': 5,
 'best': 0.006420736818512296,
 'births': 80160,
 'cx_pb': 0.9,
 'exp': 128,
 'k_par': 6,
 'k_sur': 6,
 'med': 2.6377157552245727,
 'mut_pb': 0.9,
 'mut_sig': 7.5,
 'pop': 160,
 'rep': 40,
 'seed': 112,
 'std': 20.059567935625164,
 'worst': 55.23488779660829}

И журналы, которые я заинтересован в хранении в качестве фреймов данных панд, имеют размер от 10 до 12 мм. Позже я уменьшу это число примерно до пятой.

После травления и снятия журнала я вижу, что я использую около 7,7 ГБ из выделенных 12,7 ГБ.

Я пробовал:

from itertools import chain
fitness_res = pd.DataFrame(list(chain.from_iterable(logbook)))

и

pop_records = [record for record in logbook]
fitness_res = pd.DataFrame(pop_records)

без успеха.

Я получил ошибку:

Your session crashed after using all available RAM. View runtime logs

Я ожидаю, что у меня будет дата-фрейм со всеми данными в журнале DEAP.

1 Ответ

1 голос
/ 02 июля 2019

DataFrame в pandas загружает все данные в память.Подходы, которые вы использовали, используют дополнительную память для загрузки данных до , передавая их pandas для хранения в DataFrame;Например,

from itertools import chain
fitness_res = pd.DataFrame(list(chain.from_iterable(logbook)))

означает, что перед передачей данных в pd.DataFrame вы создаете список всех прочитанных значений.

В то время как при втором подходе:

pop_records = [record for record in logbook]
fitness_res = pd.DataFrame(pop_records)

Вы создаете список с использованием понимания списка, который снова загружает все данные в память, прежде чем передать его в pandas.

Я предлагаю использовать функцию загрузки данных pandas непосредственно в запеченный файл.используя pandas.read_pickle:

fitness_res = pd.read_pickle(pickle_file_path)
...