python - 使用 dask 合并 csv 文件

标签 python dask

我是 python 新手。我正在使用 dask 读取 5 个大型(> 1 GB)csv 文件并将它们合并(类似 SQL)到一个 dask 数据帧中。现在,我正在尝试将合并结果写入单个 csv。我在 dask 数据帧上使用 compute() 将数据收集到单个 df 中,然后调用 to_csv。但是,compute() 在跨所有分区读取数据时速度很慢。我尝试直接在 dask df 上调用 to_csv,它创建了多个 .part 文件(我没有尝试将这些 .part 文件合并到 csv 中)。是否有任何替代方法可以将 dask df 转换为单个 csv 或 compute() 的任何参数以收集数据。我使用的是 6GB 内存和 HDD 以及 i5 处理器。

谢谢

最佳答案

Dask.dataframe 不会写入单个 CSV 文件。正如您提到的,它将写入多个 CSV 文件,每个分区一个文件。您调用 .compute().to_csv(...) 的解决方案会起作用,但是调用 .compute() 会将完整的 dask.dataframe 转换为 Pandas 数据帧,这可能会填满内存。

一个选择是完全避免 Pandas 和 Dask,只从多个文件中读取字节并将它们转储到另一个文件

with open(out_filename, 'w') as outfile:
    for in_filename in filenames:
        with open(in_filename, 'r') as infile:
            # if your csv files have headers then you might want to burn a line here with `next(infile)
            for line in infile:
                outfile.write(line + '\n')

如果除了将 CSV 文件合并到一个更大的文件之外不需要做任何事情,那么我会这样做,根本不接触 pandas/dask。他们会尝试将 CSV 数据读入内存数据,这需要一段时间,而您不需要这样做。另一方面,如果您需要使用 pandas/dask 进行一些处理,那么我会使用 dask.dataframe 来读取和处理数据,写入许多 csv 文件,然后使用上面的技巧将它们合并。

您还可以考虑写入 CSV 以外的数据存储。 HDF5 和 Parquet 等格式可以更快。 http://dask.pydata.org/en/latest/dataframe-create.html

关于python - 使用 dask 合并 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42965337/

相关文章:

python - Pandas pivot_table 的更快替代品

python - 估计 pandas 数据帧大小而不加载到内存中

python - 从 HDF5 文件列表创建一个 dask 数据框

python - 将一列随机数添加到 dask 数据帧的正确方法

python - 对 max() 内置函数感到困惑

python - 自动清理 Python Spyder 中的绘图 Pane

python - 将多个面板上的绘图标签安排在 matplotlib 中的一行中

python - 获取具有重复值的行的第一个版本与一列

python - 如何保存带有标签和刻度区域透明但不是 matplotlib 主绘图区域的绘图?

python - 使用 Dask 在大型集合上映射可变执行时间的函数