我在Parquet中存储了约5.5GB数据集。我在该数据集account_language
中有一个系列,该系列最初是对象(字符串)类型的。
有人可以解释为什么在将序列转换为分类后进行相同的计算会花费更长的时间吗?我会错误地转换为分类吗?
df = dd.read_parquet('dataset', engine='fastparquet')
%time pre_cat_val_counts = df.account_language.value_counts().compute()
CPU时间:用户2.9 s,系统时间:678 ms,总计:3.57 s挂墙时间:3.34 s
df = df.categorize(columns=['account_language'])
%time post_cat_val_counts = df.account_language.value_counts().compute()
CPU时间:用户1min 4s,sys:23 s,总计:1min 27s>墙壁时间:1min 9s
答案 0 :(得分:2)
因此,在思考这个问题的过程中,我解决了这个问题,但是当我写下问题时,我想最好还是保留一些以防万一。原因是我对Dask的运作方式有误解。
问题在于,调用.compute()
实际上正在同时运行分类转换和value_count操作。实际上,我已经将密集的分类过程和.value_count()
命令排在了队列中,并且正在测量完成这两个过程所需的时间。在分类FIRST上运行.compute()
可以使以后的计算更快。
df = df.categorize(columns=['account_language']).compute()
%time post_cat_val_counts = df.account_language.value_counts()
CPU时间:用户42.5 ms,sys:1.08 ms,总计:43.6 ms 墙壁时间:42.4毫秒