如何使用Python快速复制多个图像
我的任务是在Windows中将数百万图像从一个网络共享驱动器移动到另一个网络共享驱动器。这些不是很大的图片,只是很多。我有900000个目录要移动,每个目录包含1-10个图像。我的目标是利用操作系统来实现最大的并发性,我认为asyncio可能会帮助我实现这一点,因为大部分时间都会花在等待网络io上。这是我到目前为止的一个片段,但它似乎仍然太慢,因为我需要5分钟才能移动大约250MB的图像。这是我到目前为止得到的一个示例,我不完全相信我的实现是可靠的如何使用Python快速复制多个图像,python,python-3.5,python-asyncio,shutil,file-copying,Python,Python 3.5,Python Asyncio,Shutil,File Copying,我的任务是在Windows中将数百万图像从一个网络共享驱动器移动到另一个网络共享驱动器。这些不是很大的图片,只是很多。我有900000个目录要移动,每个目录包含1-10个图像。我的目标是利用操作系统来实现最大的并发性,我认为asyncio可能会帮助我实现这一点,因为大部分时间都会花在等待网络io上。这是我到目前为止的一个片段,但它似乎仍然太慢,因为我需要5分钟才能移动大约250MB的图像。这是我到目前为止得到的一个示例,我不完全相信我的实现是可靠的 async def iter_copytree
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(...))
rsync、xcopy、robocopy
在您需要编写一行代码之前,有多个高度可扩展的解决方案为什么您认为使用多线程可以加快此类应用程序的速度?如果有一个磁盘是文件的来源,另一个磁盘是文件的目的地,并且有一个网络连接将文件连接在一起,那么我希望应用程序的性能会受到操作系统和网络的强烈限制。(当然,我可能错了)。您是否尝试过一个简单的测试程序,比如:在一个线程中传输1000个文件,然后在两个线程之间拆分相同的工作?你能看到任何性能差异吗?asyncio库是无线程的,如果做得好,它应该将在事件循环中拾取的阻塞调用排队。因此,如果它不是多线程的,那么事件循环如何帮助文件传输更快?我仍然认为您受到计算环境的限制,而不是python程序的速度或结构。通过使用Windows资源管理器将这些小图像文件从一台电脑拖动到另一台电脑,需要多长时间才能移动250 MB的文件?我的经验是,无论你怎么做,移动很多小文件的速度都非常慢。压缩文件可能会有帮助。所有的i/o调用都被阻塞,所以我不想一次只执行一个,因为cpu在网络上等待的大部分时间都是空闲的。这就是我想说的。如果(1)CPU空闲等待网络,以及(2)应用程序需要网络,则无法通过更高效地使用CPU来加速应用程序。线程、多处理或事件循环只有在允许CPU的空闲周期做一些有用的事情时才能起作用。当我写这条评论时,我的CPU大部分是空闲的,等待我键入下一个键。我不认为这是一个问题,因为CPU不是阻止我更快完成的东西。