mcs*_*ini 2 python pandas dask fastparquet
我正在将大量(100 到 1000)的镶木地板文件读取到单个 dask 数据帧(单台机器,全部本地)中。我意识到
files = ['file1.parq', 'file2.parq', ...]
ddf = dd.read_parquet(files, engine='fastparquet')
ddf.groupby(['col_A', 'col_B']).value.sum().compute()
Run Code Online (Sandbox Code Playgroud)
效率比
from dask import delayed
from fastparquet import ParquetFile
@delayed
def load_chunk(pth):
return ParquetFile(pth).to_pandas()
ddf = dd.from_delayed([load_chunk(f) for f in files])
ddf.groupby(['col_A', 'col_B']).value.sum().compute()
Run Code Online (Sandbox Code Playgroud)
对于我的特定应用程序,第二种方法 ( from_delayed) 需要 6 秒才能完成,第一种方法需要 39 秒。在这种dd.read_parquet情况下,在工作人员开始做某事之前似乎就有很多开销,并且有相当多的transfer-...操作分散在任务流图中。我想了解这里发生了什么事。read_parquet该方法速度如此之慢的原因可能是什么?它与仅仅读取文件并将它们分成块有什么不同?
您正在经历客户端尝试建立数据列的最小/最大统计信息,从而为数据帧建立良好的索引。索引对于防止读取特定作业不需要的数据文件非常有用。
在许多情况下,当文件中的数据量较大且文件总数较小时,这是一个好主意。在其他情况下,相同的信息可能包含在特殊的“_metadata”文件中,因此无需首先读取所有文件。
为了防止扫描文件的页脚,您应该调用
dd.read_parquet(..,. gather_statistics=False)
Run Code Online (Sandbox Code Playgroud)
这应该是 dask 的下一版本中的默认设置。
| 归档时间: |
|
| 查看次数: |
2219 次 |
| 最近记录: |