Python 3.x 如何在不耗尽内存的情况下使用dask来分组并应用自定义函数?

Python 3.x 如何在不耗尽内存的情况下使用dask来分组并应用自定义函数?,python-3.x,dask,dask-dataframe,Python 3.x,Dask,Dask Dataframe,我知道我可以在spark上轻松做到这一点,但我一直在尝试dask并不断出现内存不足的错误,也许我做得不对 情况是这样的:我有一个非常大的数据帧,我们称之为dfdf有两列:键和金额 key amount 1 4.2 1 4.3 1 4.2 2 4.1 2 4.1 2 4.3 我有一个自定义函数: def process(df): // a lot of processing // cant be written in

我知道我可以在spark上轻松做到这一点,但我一直在尝试dask并不断出现内存不足的错误,也许我做得不对

情况是这样的:我有一个非常大的数据帧,我们称之为
df
df
有两列:键和金额

   key  amount 
    1 4.2
    1 4.3
    1 4.2
    2 4.1 
    2 4.1
    2 4.3
我有一个自定义函数:

def process(df):
    // a lot of processing 
    // cant be written in dask
    return df 
正如您所看到的,该过程对整个数据帧进行操作,并返回一个已处理的新数据帧。进程中的内容无法转换为dask

我需要按键进行分区(所以每个键有一个数据帧),在每个键的数据帧上运行进程,然后将它们合并回一个数据帧,最后将其作为csv写入

我尝试了
df.groupby(“key”).apply(process).to_csv(…)
,但内存不足。 我还尝试了
df.map\u分区(…).compute()
,但内存不足

我阅读了文档,甚至尝试了
df.map\u分区(lambda x:x.groupby(..).apply(proc))
,但意识到这不起作用,因为这些组不是通过分区隔离的


我知道这很容易做到我做错了什么?

嗨,约翰!欢迎来到堆栈溢出。为了得到最好的结果,试着在你的问题中加入一个答案。这将帮助我们更准确地了解您面临的关键挑战,以及我们自己调试问题。我的一个问题是-流程功能是否需要先处理组中的所有元素?你能用多次传球来跑吗?e、 g.
df.map_分区(lambda x:x.groupby(…).apply(proc)).groupby(…).apply(proc).compute()
?Hi@MichaelDelgado感谢您的回答是的。不幸的是,流程函数确实需要先处理组中的所有元素。我不能分享所有东西,但示例可能是proc只是对所有元素进行排序,然后将1添加到Amuntok中-是的,如果您不能提供有关您需求的信息,我们很难提供帮助。我会查看上的文档,看看是否可以实现更高效地处理内存的聚合器。在第一个聚合步骤中,尝试尽快转储尽可能多的数据。这会有所帮助。我可以问一下,有没有办法将map_分区中的分区设置为我的数据帧(或另一列)的索引?我想这会解决我的问题。我建议阅读dask.dataframe文档,它们非常棒。尤其是退房。如果这些都不适合你,你可以随时使用dask包或延迟。