簡體   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