簡體   English   中英

使用dask下載,處理和連接到TFRecords的最佳方法

[英]best way to download, process, and concat into TFRecords using dask

我需要下載圖像,對其進行一些圖像處理,然后將它們打包到n TFRecords中(例如,每個TFRecord 100張圖像)。

使用python隊列執行此操作,我將擁有d下載線程, p處理圖像的輔助進程,然后具有w可用的可用TFRecordWriter寫入圖像的輔助進程。

我想用試試這個dask所以我有這樣的:

urls = bag.from_sequence(images_urls)
processed = urls.map(download_image).map(process)
by2 = processed.repartition(2).map_partitions(packing)
by3 = processed.repartition(3).map_partitions(packing)
bag.concat([by2, by3]).compute()

上面的問題是map_partitions似乎沒有以流式方式獲取圖像。 在分區上調用packing功能之前,整個分區似乎已在內存中。

另一個煩惱與上面的是,我看到沒有辦法dask精細地控制哪些DAG的一部分,被安排在那里。 下載程序可以與線程調度程序一起發生,其中線程處理和打包程序部分需要在不同的進程中發生。 這是可能的還是您在整個圖形上堅持使用某種調度程序?

如果您不希望一個bag一個批地加載多個圖像,則可以將您的包構造為每個分區只有一個項目(因為您事先知道URL的數量)。 實際上,在給定任務可以執行給定任務之前,確實需要將該任務的所有輸入存儲在該工作者中。

也許更簡單的方法是退回使用delayed語法,例如

ims = [dask.delayed(download_image)(url) for url in images_urls]
processed = [dask.delayed(process)(im) for im in ims]
packs = [dask.delayed(packing)(processed[n:n+100]) for n in
         range(0, len(processed), 100)]
dask.compute(packs)

確實,您只能有一個調度程序來執行圖形,但是Dask會嘗試調度程序任務在加載數據的位置運行。

暫無
暫無

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

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