Python 使用dask将单个16M行csv并行转换为拼花地板

Python 使用dask将单个16M行csv并行转换为拼花地板,python,csv,dataframe,parquet,dask,Python,Csv,Dataframe,Parquet,Dask,以下操作可行,但需要将近2小时: from dask import dataframe as ddf ddf.read_csv('data.csv').to_parquet('data.pq') 有没有办法将其并行化 文件data.csv未压缩约2G,有1600万行22列。我不确定这是否是数据问题。我在我的机器上做了一个玩具示例,同样的命令需要大约9秒钟 import dask.dataframe as dd import numpy as np import pandas as pd fro

以下操作可行,但需要将近2小时:

from dask import dataframe as ddf
ddf.read_csv('data.csv').to_parquet('data.pq')
有没有办法将其并行化


文件
data.csv
未压缩约2G,有1600万行22列。

我不确定这是否是数据问题。我在我的机器上做了一个玩具示例,同样的命令需要大约9秒钟

import dask.dataframe as dd
import numpy as np
import pandas as pd
from dask.distributed import Client
import dask
client = Client()
# if you wish to connect to the dashboard
client

# fake df size ~2.1 GB
# takes ~180 seconds
N = int(5e6)
df = pd.DataFrame({i: np.random.rand(N) 
                   for i in range(22)})
df.to_csv("data.csv", index=False)

# the following takes ~9 seconds on my machine
dd.read_csv("data.csv").to_parquet("data_pq")

使用
重新分区
方法,并行写入多个CSV文件也很容易:

df=dd.read\u csv('data.csv'))
df=df.重新分区(npartitions=20)
df.to_拼花地板('./数据_pq',写入索引=False,压缩=snappy')
Dask喜欢使用大约100MB的分区,所以对于2GB的数据集,20个分区应该是好的

您还可以通过在读取CSV之前拆分CSV来加快速度,这样Dask就可以并行读取CSV文件。您可以使用将2GB CSV拆分为20个不同的CSV,然后在不重新分区的情况下将其写出:

df=dd.read\u csv('folder\u with\u small\u csv/*.csv'))
df.to_拼花地板('./数据_pq',写入索引=False,压缩=snappy')

read\u csv
有一个
blocksize
参数(),可用于控制生成分区的大小,从而控制分区的数量。据我所知,这将导致并行读取分区——每个工作进程将读取相关偏移量处的块大小

您可以设置
blocksize
,使其产生所需数量的分区以利用您拥有的核心。比如说

cores=8
size=os.path.getsize('data.csv')
ddf=dd.read\u csv(“data.csv”,blocksize=np.rint(大小/核心))
打印(ddf.npartitions)
将输出:

八,


更好的是,您可以尝试修改大小,以便生成的拼花地板具有推荐大小的分区(我在不同的位置看到了不同的数字:-|).

您能告诉我们
data.csv的大小吗?@user32185 2G未压缩,有1600万行22列。您能告诉我您的数据类型吗?问题是您将其写入一个文件中。