设置是我有八个大的 csv 文件(每个 32GB),每个文件都用 Zip 压缩为 8GB 文件。我无法使用未压缩的数据,因为我想节省磁盘空间,但没有剩余 32*8GB 空间。我无法加载一个文件,例如pandas
因为它不适合内存。
我认为 Dask 是完成该任务的合理选择,但如果您认为它适合目的,请随意建议其他工具。
是否可以通过并行读取压缩文件的多个块、处理每个块并将结果保存到磁盘来使用 Dask 处理一个 8GB 压缩文件?
第一个问题是达斯克不支持.zip http://dask.pydata.org/en/latest/bytes.html#compression. 这个问题 https://github.com/dask/dask/issues/2554建议使用dask.delayed
,但我也可以将格式更改为.xz
或者是其他东西。
其次,可能与压缩格式的选择相关的是是否可以并行访问压缩文件的仅部分内容。
或者最好将每个未压缩的 csv 文件分割成适合内存的较小部分,然后使用如下所示处理重新压缩的较小部分:
import dask.dataframe as dd
df = dd.from_csv('files_*.csv.xz', compression='xz')
现在,我更喜欢类似于第一个解决方案的东西,它似乎更精简,但我可能完全错误,因为这个领域对我来说是新的。
感谢您的帮助!
The easiest解决方案当然是将大文件流式传输到多个压缩文件中(记住每个文件以换行符结束!),然后按照您的建议使用 Dask 加载这些文件。每个较小的文件将成为内存中的一个数据帧分区,因此只要文件足够小,在使用 Dask 处理数据时就不会耗尽内存。
这里的根本原因是,格式列表 bz2、gz 或 zip 不允许随机访问,读取数据的唯一方法是从数据的开头开始。xz
是唯一允许在文件内进行块式压缩的格式,因此原则上可以进行块式加载,这与真正的随机访问不太一样。那会做你所追求的。然而,这种模式实际上与拥有单独的文件非常相同,因此不值得付出额外的努力以阻塞模式(不是默认模式)写入文件并使用函数dask.bytes.compression.get_xz_blocks, xz_decompress
,当前未用于代码库中的任何内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)