嗨,我是 dask 数据框的新手,正在研究它如何通过分布式计算来改善处理时间。我的代码正在使用 5m+ 行文件,如下所示
client = Client('127.0.0.1:8786')
start_time = time.time()
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time)))
ddf = dask.dataframe.read_csv(filename)
ddf = ddf[['Prod_desc']].drop_duplicates()
ddf = ddf.query(filter_text)
df = ddf.head(1000, npartitions=-1)
end_time = time.time()
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(end_time)))
print(end_time - start_time, 'secs')
结果如下
分布式1个服务器,1个worker/server 22.344669342041016 秒
分布式2个服务器,1个worker/server 11.367061614990234 秒
分布式3台服务器,1台worker/server 9.111485004425049 秒
分布式3个服务器,2个worker/server 6.44242000579834 秒
分布式3台服务器,3台worker/server 8.706154823303223 秒
处理速度并没有像我们预期的那样线性提高。当我们在每台服务器上使用 3 个 worker 时,使用的时间比每台服务器使用 2 个 worker 多。
有人知道这是怎么发生的吗?谢谢。
答案 0 :(得分:0)
如果我正确阅读了代码,您会阅读数据,然后删除重复项,然后显示前 1000 项。 我怀疑这些步骤中的一个或两个都需要对数据进行洗牌,甚至可能需要混洗到一个地方。
如果您需要进行 shuffle,这会花费时间(节点之间的数据传输会接触服务器之间的网络和磁盘,不确定服务器内会发生什么),那么这将是我看到速度变慢的主要原因。
>通常并行处理应该线性加速,但是如果您可以执行多个处理步骤并且改组只是一个次要组成部分,则尤其如此,在这项工作中处理非常轻,甚至可能花费更少的时间而不是简单地传输数据。
答案 1 :(得分:0)
你可以尝试删除吗
ddf = ddf[['Prod_desc']].drop_duplicates()
然后再次测试时间? 此步骤可能会删除太多行,因此下一步的行太少。