簡體   English   中英

Python 和 Dask - 讀取和連接多個文件

[英]Python and Dask - reading and concatenating multiple files

我有一些parquet文件,它們都來自同一個域,但結構有所不同。 我需要連接所有這些。 下面是這些文件的一些示例:

file 1:
A,B
True,False
False,False

file 2:
A,C
True,False
False,True
True,True

我要做的是以最快的方式讀取和連接這些文件,獲得以下結果:

A,B,C
True,False,NaN
False,False,NaN
True,NaN,False
False,NaN,True
True,NaN,True

為此,我使用以下代碼,使用 ( Reading multiple files with Dask , Dask dataframes: reading multiple files & storage filename in column ) 提取:

import glob

import dask.dataframe as dd
from dask.distributed import Client
import dask

def read_parquet(path):
    return pd.read_parquet(path)

if __name__=='__main__':

    files = glob.glob('test/*/file.parquet')

    print('Start dask client...')
    client = Client()

    results = [dd.from_delayed(dask.delayed(read_parquet)(diag)) for diag in diag_files]

    results = dd.concat(results).compute()

    client.close()

此代碼有效,它已經是我能想到的最快版本(我嘗試了順序pandasmultiprocessing.Pool )。 我的想法是,Dask 可以理想地開始連接的一部分,同時仍然讀取一些文件,但是,從任務圖中,我看到對每個 parquet 文件的元數據進行了一些順序讀取,請參見下面的屏幕截圖: 任務圖儀表板

任務圖的第一部分是read_parquetread_metadata的混合。 第一部分始終只顯示執行的 1 個任務(在任務處理選項卡中)。 第二部分是from_delayedconcat的組合,它使用了我所有的工人。

關於如何加快文件讀取並減少圖表第一部分的執行時間的任何建議?

您的代碼的問題是您使用Pandas版本的read_parquet

而是使用:

  • read_parquetdask版本,
  • map客戶提供的收集方法,
  • concatdask版本,

就像是:

def read_parquet(path):
    return dd.read_parquet(path)

def myRead():
    L = client.map(read_parquet, glob.glob('file_*.parquet'))
    lst = client.gather(L)
    return dd.concat(lst)

result = myRead().compute()

在此之前,我創建了一個客戶端,只有一次。 原因是在我早期的實驗中,當我嘗試再次創建它時(在函數中),我收到一條錯誤消息,即使第一個實例之前已經關閉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM