我有大于5GB的大文件。 我已将它们存储为实木复合地板格式。 当我对600k +条记录的小样本集进行如下所示的分组操作时,Dask花费了6分钟以上,而熊猫只花费了0.4秒。 尽管我理解如果数据集适合内存,熊猫会更快,但我的问题是,如果我将整个镶木文件传递给Dask数据框,性能会提高吗?

还建议我如何改进以下代码,以便我可以在几秒钟而不是几分钟内运行。

示例:使用Dask数据框

StartTime = datetime.datetime.now()
df = dd.read_parquet('201908.parquet', columns=['A', 'B'], engine='pyarrow')
print (len(df))
df = df.set_index ('A')
rs = df.groupby('A').B.nunique().nlargest(10).compute(scheduler='processes')
print (rs)
EndTime = datetime.datetime.now()
print ("Total Time Taken for processing: " + str(EndTime - StartTime))

输出为:

606995
A
-3868378286825833950    7
 1230391617280615928    7
 381683316762598393     6
-5730635895723403090    5
 903278193888929465     5
 2861437302225712286    5
-9057855329515864244    4
-8963355998258854688    4
-7876321060385968364    4
-6825439721748529898    4
Name: B, dtype: int64
Total Time Taken for processing: 0:06:05.042146

使用熊猫的示例:

StartTime = datetime.datetime.now()
df = pd.read_parquet('201908.parquet', columns=['A', 'B'], engine='pyarrow')
print (len(df))
df = df.set_index ('A')
rs = df.groupby('A').B.nunique().nlargest(10)
print (rs)
EndTime = datetime.datetime.now()
print ("Total Time Taken for processing: " + str(EndTime - StartTime))

输出为:

606995
A
-3868378286825833950    7
 1230391617280615928    7
 381683316762598393     6
-5730635895723403090    5
 903278193888929465     5
 2861437302225712286    5
-9057855329515864244    4
-8963355998258854688    4
-7876321060385968364    4
-6825439721748529898    4
Name: B, dtype: int64
Total Time Taken for processing: 0:00:00.419033

#1楼 票数:0

我相信对于dask数据帧,近似groupby nunique算法存在一个未解决的问题。 如果您特别感兴趣,可以考虑一下。 达斯克数据框的非分组非唯一算法要快得多。

  ask by KB Devaraj translate from so

未解决问题?本站智能推荐:

1回复

如何使用dask提高并行计算的性能

我有一个pandas数据框并转换为dask数据框 df.shape =(60893,2) df2.shape =(7254909,2) 如何查看dask数据框的形状? 为什么.head()需要这么多时间? 我做对了吗?
1回复

CSV日期解析时缓慢的Dask性能?

我一直在对大量文件进行大量的文本处理,包括大型CSV和大量的小型XML文件。 有时我正在进行聚合计数,但很多时候我正在进行NLP类型的工作,以便更深入地查看这些文件中除标记或已经结构化之外的内容。 我一直在使用多处理库来跨多个CPU执行这些计算,但我已经爱上了Dask背后的想法,它强烈建
1回复

附加多列时,如何解释 DataFrame.assign(**kwargs) 和 dd[x]=y 在 Dask 中的性能差异?

在将一些代码从 Pandas 迁移到 Dask 时,我发现通过使用多列调用DataFrame.assign()修改 Dask 数据帧与使用多个DataFrame.__setitem__() (又名DataFrame.__setitem__() dataframe[x]=y )调用修改它之间存在巨大的
2回复

使用 Dask 的新 to_sql 提高效率(内存/速度)或替代从 dask 数据帧获取数据到 SQL Server 表

我的最终目标是将 SQL/Python 一起用于一个有太多数据供熊猫处理的项目(至少在我的机器上)。 所以,我和dask去: 从多个来源(主要是 SQL Server 表/视图)读入数据 将数据操作/合并到一个包含约 1000 万行和 52 列的大型 dask 数据框表中,其中一些具有一些长
1回复

将dask数据帧转换为数据帧太慢,在使用它并行处理时不会节省时间

import pandas as pd import dask.dataframe as dd import time 结果是: 它花费的时间是1.0297248363494873秒 它花费的时间是0.008629083633422852秒 但转换所需的时间为
1回复

覆盖 Dask do Pandas 时性能下降 - 计算()

我正在用 python 读取一个大文本文件。 使用 Dask 提高内存性能。 但是当使用 df.compute() 将 Dask 数据帧转换为 Pandas 时。 因为我需要通过 Pandas 执行大量转换。 我检查了 df.compute() 之后的内存使用量 (guppy3) 是否增加了
1回复

Dask 和 fbprophet

我正在尝试同时使用dask和fbprophet库,但我要么做错了什么,要么遇到了意外的性能问题。 一方面,我有一个自定义函数,它在大约 0.1 秒内运行,因此forecast1dd和forecast1mp正在模拟我的函数和以下数据帧 我获得(分别) 在第一种情况下,内核未以 100% 使
1回复

优化Pyspark性能以匹配熊猫/达斯?

我有每周的时间序列数据,并且正在尝试使用Pyspark SQL为几列计算过去8周的每周总和。 我已经尝试过使用Pyspark窗口功能; 特别: 但是此代码运行非常慢(每列30-60秒,包含1000个唯一ID和170个时间步长)。 我从其他StackOverflow问题中了解到,分区