Python Dask延迟总和被杀死,但有足够的资源

Python Dask延迟总和被杀死,但有足够的资源,python,dask,dask-delayed,dask-dataframe,Python,Dask,Dask Delayed,Dask Dataframe,我正在创建一个函数,该函数读取整个文件夹,创建一个Dask数据帧,然后处理该数据帧的分区并对结果求和,如下所示: import dask.dataframe as dd from dask import delayed, compute def partitions_func(folder): df = dd.read_csv(f'{folder}/*.csv') partial_results = [] for partition in df.partitions:

我正在创建一个函数,该函数读取整个文件夹,创建一个Dask数据帧,然后处理该数据帧的分区并对结果求和,如下所示:

import dask.dataframe as dd
from dask import delayed, compute

def partitions_func(folder):
    df = dd.read_csv(f'{folder}/*.csv')
    partial_results = []
    for partition in df.partitions:
        partial = another_function(partition)
        partial_results.append(partial)
    total = delayed(sum)(partial_results)
    return total
分区\u func
中调用的函数(
另一个\u函数
)也会延迟

@delayed
def another_function(partition):
    # Partition processing
    return result
我检查过,在处理过程中创建的变量都很小,所以它们不会引起任何问题。分区可以相当大,但不能大于可用RAM

当我执行
partitions\u func(folder)
时,进程被终止。起初,我认为问题在于有两个
延迟
,一个在
上,另一个在
上,另一个在
延迟(sum)

从另一个函数
中删除
延迟的
修饰符
会导致问题,因为该参数是Dask数据帧,不能执行类似于
tolist()
的操作。我尝试从
sum
中删除
delayed
,因为我认为这可能是并行化和可用资源的问题,但进程也会被终止

但是,我知道有5个分区。如果我从
partitions\u func
中删除语句
total=delayed(sum)(partial_results)
,并“手动”计算总和,则一切都会按预期进行:

total = partial_results[0].compute() + partial_results[1].compute() + partial_results[2].compute() \
        + partial_results[3].compute() + partial_results[4].compute()

谢谢

Dask dataframe创建一系列延迟对象,因此当您调用一个延迟函数
时,另一个成为嵌套延迟且
Dask.compute
的函数将无法处理它。一个选项是使用
.map\u partitions()
,典型的例子是
df.map\u partitions(len).compute()
,它将计算每个分区的长度。因此,如果您可以重写另一个_函数
,以接受熊猫数据帧,并删除延迟的装饰器,那么您的代码大致如下所示:

import dask.dataframe as dd
from dask import delayed, compute

def partitions_func(folder):
    df = dd.read_csv(f'{folder}/*.csv')
    partial_results = []
    for partition in df.partitions:
        partial = another_function(partition)
        partial_results.append(partial)
    total = delayed(sum)(partial_results)
    return total
df=dd.read\u csv(f'{folder}/*.csv')
total=df.map_分区(另一个_函数)

现在,
total
是一个延迟对象,您可以将它传递给
dask.compute
(或者只需运行
total=df.map\u分区(另一个函数).compute()
)。

Hi@SultanOrazbayev,您说得对。现在代码运行得很慢。我可以在不到一个小时内(按顺序)分割数据并使用Pandas运行代码,但使用
dask
,它永远不会完成(我的实际数据更大,所以我需要
dask
)。我尝试了一个更简单版本的
另一个_函数
(df上的随机操作)和
映射分区
,它运行得很快。但是,当我添加real方法(行为点的加权装箱)时,速度会变慢。我检查了UI和
top
,发现工作人员使用的资源很少,进程大部分时间处于休眠状态。您是否使用
另一个函数中的库?如果是这样,请尝试在函数中导入这些库(我对某些库有类似的经验)。您好,是的,我使用了一个调用Cython的库中的函数,因此我自己编写了该方法。这不是我想要的,但它现在起作用了。谢谢