在Colab中将长的DEAP日志(10 MM)转换为数据帧时,如何解决RAM限制?

时间:2019-07-02 10:14:05

标签: python pandas dataframe deap

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

我正在使用DEAP软件包进行一些实验,因为我的机器运行缓慢且很旧,我一直在使用Google的Colab服务来帮助自己。 模拟的结果是DEAP的日志,这是字典的列表。每个字典都是模拟屏幕截图的重要值的摘要。 我一直在将字典列表转换为数据帧以进行分析,但是对于最大的模拟,由于超出分配的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}

我感兴趣的存储为大熊猫数据帧的日志在10毫米到12毫米之间。稍后,我会将其减少到五分之一左右。

腌制和解开日志后,我发现分配的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的日志中有一个包含所有数据的数据框。

1 个答案:

答案 0 :(得分:1)

pandas中的

DataFrame将所有数据加载到内存中。您正在使用的方法是在将数据传递到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)