【发布时间】:2020-12-07 23:05:40
【问题描述】:
我有两个文件无法加载到我的 RAM(超过 100GB)。
两个文件格式相似,例如:
A 8
B 6
C 9
和
AC 8
BA 6
CQ 35
例如,我还有一本包含我的映射的字典
alias_dict = {"A": "AC", "B": "BA", "C": "CQ"}
我想要做的只是将字典应用于第一个数据帧,然后在两个数据帧之间合并,这样在本例中,我的预期输出将是
AC 8
BA 6
我尝试使用以下代码来实现这一点
pileup_df['identifier'] = pileup_df.identifier.map(lambda identifier: alias_dict[identifier], meta=('identifier', str))
pileup_df.compute()
lists_df['identifier'] = lists_df.identifier.map(lambda identifier: alias_dict[identifier], meta=('identifier', str))
lists_df.compute()
intersection_df = dd.merge(pileup_df, lists_df, on=['identifier', 'position'])
intersection_df = intersection_df[['identifier', 'position']]
intersection_df.compute()
问题是,只有当我指定 pileup_df.compute() 和 lists_df.compute() 时才会发生转换,就像上面代码中写的那样,但这实际上会将这些数据帧加载到内存中。
当我删除上面提到的compute 语句时,我的数据框仍保持未转换的形式。
为了清楚起见,没有按预期工作的代码是
pileup_df.identifier.map(lambda identifier: alias_dict[identifier], meta=('identifier', str))
lists_df.identifier.map(lambda identifier: alias_dict[identifier], meta=('identifier', str))
intersection_df = dd.merge(pileup_df, lists_df, on=['identifier', 'position'])
intersection_df = intersection_df[['identifier', 'position']]
intersection_df.compute()
有没有办法在不先将转换后的数据帧加载到内存的情况下应用这种转换和合并?
【问题讨论】: