在将带有大约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的日志中有一个包含所有数据的数据框。
答案 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)