繁体   English   中英

使用 Dask 下载、处理并保存到 csv

[英]Using Dask to download, process, and save to csv

问题

我的部分工作流程涉及下载数十万个文件,解析数据,然后在本地保存到 csv。 我正在尝试使用 Dask 设置此工作流程,但它似乎没有并行处理。 Dask 仪表板显示每个工作人员的 cpu 百分比较低,并且任务选项卡为空。 状态也不显示任何内容。 htop似乎一次不会处理超过 1 或 2 个“正在运行”。 我不知道如何从这里开始。

相关: 我应该如何使用 dask.dataframe 有效地编写多个 CSV 文件? (这个问题所基于的旧问题)

例子

from dask.delayed import delayed
from dask import compute
from dask.distributed import Client, progress
import pandas as pd
import wget
import zipfile
import multiprocessing


def get_fn(dat):    
    ### Download file and unzip based on input dat
    url = f"http://www.urltodownloadfrom.com/{dat['var1']}/{dat['var2']}.csv"
    wget.download(url)
    indat = unzip()

    ### Process file
    outdat = proc_dat(indat)
    
    ### Save file
    outdat.to_csv('file_path')

    ### Trash collection with custom download fn
    delete_downloads()


if __name__ == '__main__':

    ### Dask setup    
    NCORES = multiprocessing.cpu_count() - 1
    client = Client(n_workers=NCORES, threads_per_worker=1)

    ### Build df of needed dates and variables    
    beg_dat = "2020-01-01"
    end_dat = "2020-01-31"
    date_range = pd.date_range(beg_dat, end_dat)
    var = ["var1", "var2"]

    lst_ = [(x, y) for x in date_range for y in var]
    date = [x[0] for x in lst_]
    var = [x[1] for x in lst_]

    indf = pd.DataFrame({'date': date, 'var': var}).reset_index()

    ### Group by each row to process
    gb = indf.groupby('index')
    gb_i = [gb.get_group(x) for x in gb.groups]

    ### Start dask using delayed
    compute([delayed(get_fn)(thisRow) for thisRow in gb_i], scheduler='processes')

仪表板

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在这一行:

compute([...], scheduler='processes')

您显式使用了一个调度程序,不是您在脚本前面设置的分布式调度程序。 如果您未在此处指定scheduler= ,您将使用正确的客户端,因为它已被设置为默认值。 您将看到仪表板中出现的东西。

请注意,您可能仍然看不到高 CPU 使用率,因为似乎大部分时间都在等待下载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM