当我创建一个延迟任务列表并将其提交给scheduler ='processes'进行计算时,随着列表中项目数量的增加,性能会降低。
随着列表中元素数量的增加,我看到整体运行时间明显增加。我期望dask可以将性能提高到一定程度,但显然有些我不了解。我有10个数据目录,每个目录包含40个文件。我将一组解析器应用于文件以生成我的输出。每个解析器都将文件读取到pandas数据框中,进行一些分析,然后写入文件。根据文件的大小和解析器的复杂程度,某些实例会运行1-2秒,而某些实例会运行10-15分钟。解析器根本不共享任何数据,它们只是读取/解析/写入磁盘。
我是新手,但是尝试使用它来并行处理这些事务,但是随着我增加创建的进程数量,它实际上减慢了工作速度。
总运行时间为:(“ step”是下面代码中的参数)
step = 1:2104秒
step = 2:2937秒
step = 5:2894秒
step = 10:3564秒
当我看到顶部时,我看到6个进程在99%的CPU和0.1%的内存下运行。每个进程只对磁盘读/写一次,因此不会造成任何延迟。
我的Linux机器上没有其他东西在运行。
for i in range(0, len(list_of_directories), step):
process_files(list_of_directories[i:i+step])
def process_files(list_of_directories):
parser_processes = []
for each_directory in list_of_directories:
files = read_files_in_directory(each_directory)
for each_file in files:
for parser in parser_list:
parser_processes.append(dask.delayed(parser)(each_file))
dask.compute(*parser_processes, scheduler='processes')
def parser(file):
df = pandas.read_csv(file)
<do stuff>
<write df to disk>
我应该补充一点,如果我删除了dask并仅将解析器顺序应用于所有文件,则运行时间为2917秒。显然,愚蠢可以为较小的“步长”值提供一些改进,但对于较大的“步长”值实际上更糟。
为什么随着传递给计算的延迟项数量的增加,迟钝的性能会变差?由于内存使用率非常低,因此结果似乎暗示着CPU资源正在被浪费。我在正确考虑吗?
答案 0 :(得分:0)
性能可能取决于许多因素。第一步通常是分析您的计算,以便您查看发生了什么。并行概要分析很困难,但是幸运的是有很多工具可以帮助您。
我一般建议使用Dask的Understanding Performance文档,特别推荐使用dask distributed dashboard(在单台计算机上也很好用)。