python - 使用 dask 加载大型压缩数据集

标签 python pandas csv zip dask

我正在尝试将一个大型压缩数据集加载到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/

相关文章:

python - 逐行添加到 Pandas 数据框

database - 将表导入 PostgreSQL 时如何转义 CSV 值中的逗号?

pandas - 如何使用符合 PEP8 的条件过滤 Pandas Dataframe?

python - 如何增加脚本运行时迭代的数组数量?

python - 我的文本分类器模型无法通过多个类别得到改进

python - 如何使用 python 3.x 从远程 url 打印 csv 内容?

python - 使用 Bottle 上传和处理 CSV 文件;可能的编码问题

python - 零填充 numpy 数组

python - Pandas - 计算和旋转以获得前两年的收入

python - 如何使用 Keras 在密集层中使用 dropout 创建自动编码器