使用 Dask 处理大型、压缩的 csv 文件
Handling large, compressed csv files with Dask
设置是我有八个大的 csv 文件(每个 32GB),每个文件都用 Zip 压缩到 8GB 文件。我无法使用未压缩的数据,因为我想保存磁盘 space 并且没有剩余 32*8GB space。我无法加载一个文件,例如pandas
因为内存放不下。
我认为 Dask 是该任务的合理选择,但如果您认为它适合该目的,请随时推荐不同的工具。
是否可以通过并行读取压缩文件的多个块来处理一个 8GB 的压缩文件,处理每个块并将结果保存到磁盘?
第一个问题是Dask does not support .zip
. This issue建议使用dask.delayed
,但我也可以将格式更改为.xz
或其他格式。
其次,可能与压缩格式的选择有关的是是否可以并行访问压缩文件的一部分。
或者最好将每个未压缩的 csv 文件拆分成适合内存的较小部分,然后使用类似这样的方法处理重新压缩的较小部分:
import dask.dataframe as dd
df = dd.from_csv('files_*.csv.xz', compression='xz')
现在,我更喜欢类似于第一个解决方案的东西,它似乎更精简,但我可能完全误会了,因为这个域对我来说是新的。
感谢您的帮助!
最简单的解决方案当然是将您的大文件分别流式传输到几个压缩文件中(记住每个文件以换行符结尾!),然后在您加载这些文件时使用 Dask建议。每个较小的文件将成为内存中的一个数据帧分区,因此只要文件足够小,您在使用 Dask 处理数据时就不会 运行 内存不足。
这里的根本原因是,格式列表bz2、gz 或zip 不允许随机访问,读取数据的唯一方法是从数据开始。 xz
是唯一允许在文件中按块压缩的格式,因此原则上可以按块加载,这与真正的随机访问不太一样。那会做你想要的。然而,这种模式实际上与拥有单独的文件非常相似,因此不值得额外努力以阻塞模式(不是默认模式)编写文件并使用函数 dask.bytes.compression.get_xz_blocks, xz_decompress
,这些函数当前未用于代码库。
设置是我有八个大的 csv 文件(每个 32GB),每个文件都用 Zip 压缩到 8GB 文件。我无法使用未压缩的数据,因为我想保存磁盘 space 并且没有剩余 32*8GB space。我无法加载一个文件,例如pandas
因为内存放不下。
我认为 Dask 是该任务的合理选择,但如果您认为它适合该目的,请随时推荐不同的工具。
是否可以通过并行读取压缩文件的多个块来处理一个 8GB 的压缩文件,处理每个块并将结果保存到磁盘?
第一个问题是Dask does not support .zip
. This issue建议使用dask.delayed
,但我也可以将格式更改为.xz
或其他格式。
其次,可能与压缩格式的选择有关的是是否可以并行访问压缩文件的一部分。
或者最好将每个未压缩的 csv 文件拆分成适合内存的较小部分,然后使用类似这样的方法处理重新压缩的较小部分:
import dask.dataframe as dd
df = dd.from_csv('files_*.csv.xz', compression='xz')
现在,我更喜欢类似于第一个解决方案的东西,它似乎更精简,但我可能完全误会了,因为这个域对我来说是新的。
感谢您的帮助!
最简单的解决方案当然是将您的大文件分别流式传输到几个压缩文件中(记住每个文件以换行符结尾!),然后在您加载这些文件时使用 Dask建议。每个较小的文件将成为内存中的一个数据帧分区,因此只要文件足够小,您在使用 Dask 处理数据时就不会 运行 内存不足。
这里的根本原因是,格式列表bz2、gz 或zip 不允许随机访问,读取数据的唯一方法是从数据开始。 xz
是唯一允许在文件中按块压缩的格式,因此原则上可以按块加载,这与真正的随机访问不太一样。那会做你想要的。然而,这种模式实际上与拥有单独的文件非常相似,因此不值得额外努力以阻塞模式(不是默认模式)编写文件并使用函数 dask.bytes.compression.get_xz_blocks, xz_decompress
,这些函数当前未用于代码库。