使用Dask处理大型压缩csv文件

时间:2018-06-07 13:01:04

标签: python csv compression dask

设置是我有八个大的csv文件(每个32GB),每个文件用Zip压缩到8GB文件。我无法使用未压缩的数据,因为我想节省磁盘空间并且没有剩余32 * 8GB的空间。我无法加载一个文件,例如pandas因为它不适合记忆。

我认为Dask是完成任务的合理选择,但如果您认为它适合目的,请随意提出不同的工具。

是否可以通过并行读取多个压缩文件块来处理带有Dask的8GB压缩文件,处理每个块并将结果保存到磁盘?

第一个问题是Dask does not support .zipThis issue建议使用dask.delayed,但我也可以将格式更改为.xz或其他内容。

其次,可能与压缩格式的选择有关的是,是否可以并行访问压缩文件的一部分。

或者最好将每个未压缩的csv文件拆分成适合内存的较小部分,然后使用以下内容处理重新压缩的较小部分:

import dask.dataframe as dd

df = dd.from_csv('files_*.csv.xz', compression='xz')

就目前而言,我更喜欢与第一种似乎更精简的解决方案类似的东西,但我可能完全错了,因为这个域对我来说是新的。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

最简单的解决方案当然是将大文件分别流式传输到几个压缩文件中(记得在换行符上结束每个文件!),然后按照建议加载那些带有Dask的文件。每个较小的文件将成为内存中的一个数据帧分区,因此只要文件足够小,就可以在使用Dask处理数据时耗尽内存。

这里的根本原因是格式列表bz2,gz或zip没有允许随机访问,读取数据的唯一方法是从数据的开头。 xz是允许在文件中进行逐块压缩的唯一格式,因此,原则上,可以按块加载,这与真正的随机访问不完全相同。这会做你想要的。但是,这种模式实际上与拥有单独的文件完全相同,因此不值得花费额外的工作来以阻塞模式(不是默认模式)编写文件并使用函数dask.bytes.compression.get_xz_blocks, xz_decompress,这些函数当前不用于代码库。