如何在将长 DEAP 日志(10 MM)转换为 Colab 中的数据帧时修复 RAM 限制?
How to fix RAM limit while turning a long DEAP logbook (10 MM) into a dataframe in Colab?
在将包含大约 10 个 MM 条目的 DEAP 日志(本质上是字典列表)转换为数据框以进行进一步处理时,我在 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 之间。稍后,我会把这个数字减少到五分之一左右。
对日志进行 pickling 和 unpickling 后,我发现我使用了分配的 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 日志中所有数据的数据框。
DataFrame in 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.read_pickle
:
直接在 pickled 文件上使用 pandas 数据加载功能
fitness_res = pd.read_pickle(pickle_file_path)
在将包含大约 10 个 MM 条目的 DEAP 日志(本质上是字典列表)转换为数据框以进行进一步处理时,我在 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 之间。稍后,我会把这个数字减少到五分之一左右。
对日志进行 pickling 和 unpickling 后,我发现我使用了分配的 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 日志中所有数据的数据框。
DataFrame in 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.read_pickle
:
fitness_res = pd.read_pickle(pickle_file_path)