如何使用Python快速复制许多图像

时间:2017-08-30 01:44:23

标签: python python-3.5 python-asyncio shutil file-copying

我有一项任务是在Windows中将数百万张图片从一个网络共享驱动器移动到另一个网络共享驱动器。这些不是非常大的图像,其中只有很多。我有900,000个目录,每个目录包含1-10个图像。我的目标是利用操作系统来实现最大的并发性,我认为asyncio可以帮助我实现这一目标,因为大部分时间都花在等待网络io上。这是我到目前为止的一个片段,但它似乎仍然太慢,因为我需要花费5分钟来移动250MB左右的图像。以下是我到目前为止所得到的一个示例,我并不完全相信我的实现是合理的。

async def iter_copytree(src, dst):
    try:
        shutil.copytree(src, dst)
        return []
    except Exception e:
        return [e]

async def iter_dircmp(src, dst):
    dcmp = filecmp.dircmp(src, dst)
    if dcmp.funny_files or dcmp.diff_files:
         return [dcmp]
    return []

async def iter_rmtree(src):
    try:
        shutil.rmtree(src)
        return []
    except Exception as e:
        return [e]

async def iter_move(src, dst):
    if await iter_copytree(src, dst):
        return
    if await iter_dircmp(src, dst):
        return
    await iter_rmtree(src)

async def move_files(src_root, dst_root, file_names):
    tasks = [iter_move(os.path.join(src_root, i), ...) for i in file_names]
    await asyncio.gather(*tasks)


loop = asyncio.get_event_loop()
loop.run_until_complete(move_files(...))

1 个答案:

答案 0 :(得分:1)

rsync,xcopy,robocopy 在需要编写代码之前,可以使用多种高度可扩展的解决方案