【问题标题】:Merging datasets using dask proves unsuccessful使用 dask 合并数据集被证明是不成功的
【发布时间】:2018-11-14 16:57:43
【问题描述】:

我正在尝试在 Python 中使用 Dask 合并大量大型数据集,以避免加载问题。我想将合并后的文件另存为.csv。事实证明,这项任务比想象的要难:

我用两个数据集组合了一个玩具示例 然后我使用的代码如下:

import dask.dataframe as dd
import glob
import os

os.chdir('C:/Users/Me/Working directory')
file_list = glob.glob("*.txt")    

dfs = []
for file in file_list:
    ddf = dd.read_table(file, sep=';')
    dfs.append(ddf)

dd_all = dd.concat(dfs)

如果我使用dd_all.to_csv('*.csv'),我只需打印出两个原始数据集。 如果我使用dd_all.to_csv('name.csv'),我会收到一条错误消息,指出该文件不存在。 (FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Me\\Working directory\\name.csv\\1.part')

我可以使用dd_all.compute() 检查合并数据集是否已成功创建。

【问题讨论】:

    标签: python merge concatenation dask dask-delayed


    【解决方案1】:

    您误解了 Dask 的工作原理 - 您看到的行为符合预期。为了能够从多个worker并行写入,每个worker都必须能够写入单独的文件;例如,在写入完成之前无法知道第一个块的长度。因此,写入单个文件必然是一个顺序操作。

    因此,默认操作是为每个输入分区写入一个输出文件,这就是您所看到的。由于 Dask 可以并行读取这些文件,因此确实提出了一个问题,即您为什么要创建一个输出文件。

    对于没有“*”字符的第二种方法,Dask 假设您提供的是目录,而不是文件,并尝试在该目录中写入两个文件,但该目录不存在。

    如果您真的想编写单个文件,可以执行以下操作之一:

    • 用repartition的方法做一个输出片再to_csv
    • 编写单独的文件并在事后将它们连接起来(注意标题行)
    • 按顺序遍历数据帧的分区以写入同一文件。

    【讨论】:

    • 我尝试在执行to_csv 之前修改我的代码添加dd_all = dd_all.repartition(npartitions=1),如果我没记错的话,这是您的第一个建议。但是,代码被证明非常缓慢(它从周五开始运行,用于许多不超过 40Gb 的表)。关于如何提高性能的任何想法?
    • Pandas 可能需要几倍于中间数据的原始数据大小,我假设您给出的是磁盘大小而不是内存大小。您可以使用分布式调度程序(甚至在进程中)运行以获取更多诊断信息;或选择其他方法之一。但是,再次,为什么你要这样做?
    • 不幸的是,该项目似乎需要生成单文件数据集。是的,我担心这些都是光盘大小。在哪里可以找到分布式调度程序指南?
    猜你喜欢
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多