首页 > 解决方案 > 如何在 Colab 中将长 DEAP 日志(10 MM)转换为数据帧时修复 RAM 限制?

问题描述

在将包含大约 10 MM 条目的 DEAP 日志(本质上是字典列表)转换为 Dataframe 以进行进一步处理时,我收到了一条关于 Google Colab 中 RAM 溢出的消息。

我正在使用 DEAP 包进行一些实验,因为我的机器又慢又旧,我一直在帮助自己使用 Google 的 Colab 服务。模拟的结果是一个 DEAP 的日志,这是一个字典列表。每个字典都是对模拟屏幕截图的重要值的汇总。我一直在将这个字典列表转换为 Dataframes 进行分析,但是对于最大的模拟,由于它超过了分配的 RAM,进程崩溃了。

字典存储这种值:

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}

我有兴趣存储为 pandas 数据帧的日志在 10MM 到 12MM 之间。稍后,我会将这个数字减少到五分之一左右。

在对日志进行腌制和解封后,我发现我使用了分配的 12.7GB 中的大约 7.7GB。

我试过了:

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 日志中所有数据的数据框。

标签: pythonpandasdataframedeap

解决方案


DataFrame inpandas将所有数据加载到内存中。您使用的方法是使用额外的内存来加载数据,然后再将其传递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)

推荐阅读