繁体   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