python - Python将大量文件错误复制到许多打开的文件
问题描述
我正在尝试将大量文件从一个目录复制到另一个目录。但是,在尝试通过使用线程来加快进程时,我收到一个错误,它抱怨打开的文件太多。目前测试批次的文件大约是 700+,下面是代码。我该如何解决?在我的示例中,我将文件从网络上的一个位置复制到同一网络上的另一个位置,文件范围从 1mb 到 100mb。
def copy_file_to_directory(file, directory):
'''
Description:
Copies the file to the supplied directory if it exists
'''
if os.path.isfile(file):
url = os.path.join(directory, os.path.basename(file))
try:
shutil.copyfile(file, url)
shutil.copystat(file, url)
return True
except IOError as e:
print (e)
return False
def copy_files_to_directory(files, directory):
'''
Directory:
Copy a list of files to directory, overwriting existing files
'''
if not os.path.isdir(directory):
os.makedirs(directory)
if not os.path.isdir(directory):
return False
workers = []
for x in files:
if os.path.isfile(x):
worker = threading.Thread(target=copy_file_to_directory, args=(x,directory))
workers.append(worker.start())
# wait until they are all done processing
for x in workers:
x.join()
return True
files = [] # list of files
copy_files_to_directory(files, 'C:/Users/John')
解决方案
您几乎肯定不希望每个文件产生一个线程。就线程给您带来好处的程度而言(无论如何您不只是使磁盘 I/O 带宽饱和),您可能应该只使用具有固定数量线程的线程池(例如 concurrent.futures.ThreadPoolExecutor)。这将限制一次打开的文件数量。事实上,这种情况在 Python 文档中作为示例给出:https ://docs.python.org/dev/library/concurrent.futures.html#concurrent.futures.Executor.shutdown
调整它以适应您的使用:
with ThreadPoolExecutor(max_workers=4) as e:
for x in files:
if os.path.isfile(x):
e.submit(copy_file_to_directory, x, directory)
推荐阅读
- r - 与原始栅格相比,tmap 正在为裁剪的栅格图层绘制不同的图例(值范围?)
- reactjs - Mobx - 更改依赖项列表中的项目时未执行 UseEffect 挂钩
- javascript - 如何包装动态的内部 div?
- pine-script - 如何编写 If 语句函数代码来搜索 Pinescript 中的源变量中是否包含特定文本?
- python - 如何使用 Python 请求登录网页?
- php - 使用 nginx 配置文件在 wordpress 中保护 wp-login.php
- powershell - Powershell在一个Select-Object中获取不同级别的节点值
- pine-script - TradingView v1 到 v4 iff 语句 Pine 脚本
- swift - 如何在 Swift 中获取 WebRTC iOS SDK 中的 getStats()?
- c# - c#字符串索引每2个元素