为什么在dask中计算索引拼花地板文件上的形状如此缓慢?

为什么在dask中计算索引拼花地板文件上的形状如此缓慢?,dask,parquet,fastparquet,Dask,Parquet,Fastparquet,我已经从位于同一文件夹中的多个拼花文件创建了一个拼花文件。每个文件对应一个分区 拼花地板文件是使用Python concurrent.futures在不同的进程中创建的。下面是我在一个进程中运行的代码示例: `df`是一个标准的熊猫数据帧,具有 22列不同类型,最多100e3行。 设置索引 df.set_indexcid,原地=真 写入单个文件 fastparquet.writefpath,df,compression='snappy,file\u scheme='simple df最多包含10

我已经从位于同一文件夹中的多个拼花文件创建了一个拼花文件。每个文件对应一个分区

拼花地板文件是使用Python concurrent.futures在不同的进程中创建的。下面是我在一个进程中运行的代码示例:

`df`是一个标准的熊猫数据帧,具有 22列不同类型,最多100e3行。 设置索引 df.set_indexcid,原地=真 写入单个文件 fastparquet.writefpath,df,compression='snappy,file\u scheme='simple df最多包含100e3行和22列,并在称为cid的整数索引上建立索引

然后,我使用以下方法创建了两个元数据文件:

`data_path`包含所有拼花地板数据文件的列表 在多个进程中创建。 fastparquet.writer.mergedata\u路径,验证\u schema=True 实际上,在包含所有拼花文件的文件夹中正确创建了_元数据和_common _元数据

我天真地认为,因为数据是索引的和/或它有元数据文件,所以获得诸如数据大小之类的基本信息应该很快。例如,以下操作需要花费很长时间:

将dask.dataframe作为ds导入 `dataset_path`是文件夹的路径 包含上面创建的所有拼花文件 以及元数据文件。 它包含约100-200个单独的拼花文件 总共约60000000行 数据=df.read\u parquetdataset\u路径 data.shape[0]。计算 这是例外吗


还要注意的是,大多数列都是int64和float64,很少是大小不同的对象字符串。

不幸的是,从元数据中提取数据帧长度的优化还不存在。相反,dask将每个分区加载到内存中并测量其长度。您会注意到,如果选择单个列或索引,这种情况发生得更快:

len(data[onecolumn])

但是,对于拼花地板的特殊情况,长度是从一组或多组元数据中预先知道的,并且能够一次性获得它是很好的。请随时在Dask问题跟踪程序上请求此功能。现在,您可以使用fastparquet.ParquetFile的count和columns属性。

就我个人而言,我直接使用fastparquet而不是Dask访问拼花元数据

元数据中有很多数据,因此值得玩转

我进一步注意到,如果有很多文件,可以将fastparquet操作放在延迟函数中,使用dask并行读取拼花元数据。例如:

@dask.delayed
def read_pf(path_to_parquet_file):
   pf = fastparquet.ParquetFile(path_to_parquet_file)
   all_stats = pf.statistics.copy()
   all_info = pf.info.copy()

什么是数据?你能解释一下df是如何创建的吗?如果数据是从多个futures对象创建的,那么对data.shape的调用可能需要从原始的concurrent.futures对象计算数据,或者最坏的情况是从磁盘计算数据。也许调用df=df.persist?我已经编辑了我的问题。我希望现在更清楚。至少我的理解是正确的,这是一个实施问题。谢谢我将提交一个功能请求。