当将DEAP的日志(基本上是字典列表)和大约10个MM条目转换为一个Dataframe进行进一步处理时,我收到了一条关于Google中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}而我感兴趣的日志作为熊猫数据存储在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日志中所有数据的数据。
发布于 2019-07-02 10:30:38
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.read_pickle直接在带泡菜的文件上使用熊猫数据加载功能。
fitness_res = pd.read_pickle(pickle_file_path)https://stackoverflow.com/questions/56850149
复制相似问题