gpt4 book ai didi

Python多进程/多线程加速文件复制

转载 作者:太空宇宙 更新时间:2023-11-03 12:55:28 24 4
gpt4 key购买 nike

我有一个程序可以将大量文件从一个位置复制到另一个位置 - 我说的是 100,000 多个文件(此时我正在复制 3​​14g 的图像序列)。他们都在巨大的、非常快速的网络存储 RAID 中。我正在使用 shutil 按顺序复制文件,这需要一些时间,所以我试图找到优化它的最佳方法。我注意到我使用的一些软件有效地使用多线程从网络读取文件,加载时间大大缩短,所以我想尝试在 python 中执行此操作。

我没有编程多线程/多进程的经验 - 这看起来是正确的领域吗?如果是这样,最好的方法是什么?我查看了其他一些关于在 python 中复制线程文件的 SO 帖子,他们似乎都说你没有速度提升,但考虑到我的硬件,我认为情况不会如此。我目前离我的 IO 上限还差得很远,资源大约为 1%(我在本地有 40 个内核和 64g RAM)。

编辑

在这个问题上获得了一些赞成票(现在已经有几年了)所以我想我还要指出一件事来加速文件复制。除了使用下面的一些答案(说真的!)可以轻松提高 8 到 10 倍的复制速度之外,我还发现 shutil.copy2 无缘无故地慢得令人难以忍受。是的,即使在 python 3+ 中。这超出了这个问题的范围,所以我不会在这里深入研究它(它也高度依赖操作系统和硬件/网络),除了通过调整 copy2 函数中的复制缓冲区大小来提及您还可以将复印速度提高 10 倍! (但是请注意,您将开始遇到带宽限制,并且在多线程和调整缓冲区大小时,增益不是线性的。在某些时候它确实平坦)。

最佳答案

更新:

我从来没有让 Gevent 工作(第一个答案),因为我无法在没有互联网连接的情况下安装模块,而我的工作站上没有互联网连接。但是,仅使用带有 python 的内置线程(我已经学会了如何使用),我能够将文件复制时间减少 8 次,我想将其发布为任何感兴趣的人的附加答案!下面是我的代码,可能很重要的一点是,由于您的硬件/网络设置,我的 8 倍复制时间很可能因环境而异。

import Queue, threading, os, time
import shutil

fileQueue = Queue.Queue()
destPath = 'path/to/cop'

class ThreadedCopy:
totalFiles = 0
copyCount = 0
lock = threading.Lock()

def __init__(self):
with open("filelist.txt", "r") as txt: #txt with a file per line
fileList = txt.read().splitlines()

if not os.path.exists(destPath):
os.mkdir(destPath)

self.totalFiles = len(fileList)

print str(self.totalFiles) + " files to copy."
self.threadWorkerCopy(fileList)


def CopyWorker(self):
while True:
fileName = fileQueue.get()
shutil.copy(fileName, destPath)
fileQueue.task_done()
with self.lock:
self.copyCount += 1
percent = (self.copyCount * 100) / self.totalFiles
print str(percent) + " percent copied."

def threadWorkerCopy(self, fileNameList):
for i in range(16):
t = threading.Thread(target=self.CopyWorker)
t.daemon = True
t.start()
for fileName in fileNameList:
fileQueue.put(fileName)
fileQueue.join()

ThreadedCopy()

关于Python多进程/多线程加速文件复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44320331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com