python - 为什么 Dask 读取 parquet 文件的速度比 Pandas 读取相同 parquet 文件的速度慢很多?

标签 python pandas dask parquet

我正在使用 Dask 和 python 测试 parquet 文件的读取速度,我发现使用 pandas 读取同一文件比 Dask 快得多。我希望了解这是为什么,以及是否有办法获得相同的性能,

版本化所有相关包

打印(dask.__version__) 打印(pd.__版本__) 打印(pyarrow.__version__) 打印(fastparquet.__version__)

2.6.0 0.25.2 0.15.1 0.3.2

import pandas as pd 
import numpy as np
import dask.dataframe as dd

col = [str(i) for i in list(np.arange(40))]
df = pd.DataFrame(np.random.randint(0,100,size=(5000000, 4 * 10)), columns=col)

df.to_parquet('large1.parquet', engine='pyarrow')
 # Wall time: 3.86 s
df.to_parquet('large2.parquet', engine='fastparquet')
 # Wall time: 27.1 s
df = dd.read_parquet('large2.parquet', engine='fastparquet').compute()
 # Wall time: 5.89 s
df = dd.read_parquet('large1.parquet', engine='pyarrow').compute()
 # Wall time: 4.84 s
df = pd.read_parquet('large1.parquet',engine='pyarrow')
 # Wall time: 503 ms 
df = pd.read_parquet('large2.parquet',engine='fastparquet')
 # Wall time: 4.12 s

使用混合数据类型数据框时,差异更大。

dtypes: category(7), datetime64[ns](2), float64(1), int64(1), object(9)
memory usage: 973.2+ MB
# df.shape == (8575745, 20)
df.to_parquet('large1.parquet', engine='pyarrow')
 # Wall time: 9.67 s

df.to_parquet('large2.parquet', engine='fastparquet')
 # Wall time: 33.3 s

# read with Dask
df = dd.read_parquet('large1.parquet', engine='pyarrow').compute()
 # Wall time: 34.5 s

df = dd.read_parquet('large2.parquet', engine='fastparquet').compute()
 # Wall time: 1min 22s

# read with pandas 
df = pd.read_parquet('large1.parquet',engine='pyarrow')
 # Wall time: 8.67 s

df = pd.read_parquet('large2.parquet',engine='fastparquet')
 # Wall time: 21.8 s

最佳答案

我的第一个猜测是 Pandas 将 Parquet 数据集保存到单个行组中,这不允许像 Dask 这样的系统进行并行化。这并不能解释为什么它更慢,但它确实解释了为什么它没有更快。

有关更多信息,我建议进行分析。您可能对此文档感兴趣:

关于python - 为什么 Dask 读取 parquet 文件的速度比 Pandas 读取相同 parquet 文件的速度慢很多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58820760/

相关文章:

python - 拆分数组时减少内存使用的最佳实践

python - 使用 Pandas reshape 长格式多值数据框

python - 如果我不知道该值属于哪一列,如何选择具有特定值的行?

python - 如何扩展数据框中的范围并复制值?

python - 如何将 dask.dataframe 预缓存到所有 worker 和分区以减少通信需求

python - 在 Python 中计算决定系数

python - 如何将年龄和性别数据添加到卷积神经网络的图像中?

python - Python 中的 __set__ 和 __setattr__ 有什么区别,应该在什么时候使用?

loops - 如何在训练/测试集中使用拆分大数据集,但也使用 pandas batchsize 迭代进行更新

python - Dask - 如何使用 apply 将系列连接到 DataFrame 中?