我正在尝试将一个大型压缩数据集加载到Python中,其结构如下:
- 年份.zip
- 年份
- 月
- 大量 .csv 文件
- 月
- 年份
到目前为止,我已经使用 ZipFile 库迭代每个 CSV 文件并使用 pandas 加载它们。
zf = ZipFile(year.zip)
for file in zf.namelist:
try:
pd.read_csv(zf.open(file))
这需要很长时间,我正在考虑优化代码。我遇到的一种选择是使用 dask 库。但是,我不知道如何最好地实现它以通过一个命令访问至少整个月的 CSV 文件。有什么建议么?也对其他优化方法持开放态度
最佳答案
有几种方法可以做到这一点。与您的建议最相似的是:
zf = ZipFile("year.zip")
files = list(zf.namelist)
parts = [dask.delayed(pandas.read_csv)(f) for f in files)]
df = dd.from_delayed(parts)
这是可行的,因为 zip 文件有一个偏移量列表,这样组件文件就可以独立读取;但是,性能可能取决于存档的创建方式,请记住:您只有一个存储设备,该设备的吞吐量无论如何都可能是您的瓶颈。
也许更符合 daskian 的方法可以做到这一点,如下所示,利用 dask 使用的文件系统抽象 fsspec
的功能
df = dd.read_csv('zip://*.csv', storage_options={'fo': 'year.zip'})
(当然,选择适合您的文件的 glob 模式;如果您在文件前面添加“zip://”,您也可以在此处使用文件列表)
关于python - 使用 dask 加载大型压缩数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60399866/