我是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或任何参数来计算()来收集数据。我正在使用带有HDD和i5处理器的6GB RAM。
由于
答案 0 :(得分:3)
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
答案 1 :(得分:0)
从Dask 2.4.0开始,您现在可以在调用single_file=True
时指定to_csv
。示例:dask_df.to_csv('path/to/csv.csv', single_file=True)
就像@mrocklin所说,我建议使用其他文件格式。