欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在Python中处理大型文件的最快方法

程序员文章站 2023-01-23 12:09:04
我们需要处理的各种目录中有大约500GB的图像。每个图像的大小约为4MB,我们有一个python脚本,一次处理一个图像(它读取元数据并将其存储在数据库中)。每个目录可能需要1-4小时才能处理,具体取决于大小。 我们可以在GNU / Linux操作系统上使用2.2Ghz四核处理器和16GB RAM。当 ......

我们需要处理的各种目录中有大约500gb的图像。每个图像的大小约为4mb,我们有一个python脚本,一次处理一个图像(它读取元数据并将其存储在数据库中)。每个目录可能需要1-4小时才能处理,具体取决于大小。

我们可以在gnu / linux操作系统上使用2.2ghz四核处理器和16gb ram。当前脚本仅使用一个处理器。利用其他内核和ram来更快地处理图像的最佳方法是什么?启动多个python进程来运行脚本会利用其他内核吗?

另一个选择是使用gearman或beanstalk之类的东西将工作分配给其他机器。我已经看了多处理库但不知道如何利用它。

 

解决方案


启动多个python进程来运行脚本会利用其他内核吗?

是的,如果任务受cpu约束,它将会。这可能是最简单的选择。但是,不要为每个文件或每个目录生成单个进程; 考虑使用像这样的工具,并让它产生每个核心两个进程的东西。

另一个选择是使用gearman或beanstalk之类的东西将工作分配给其他机器。

那可能有用。另外,看看zeromqpython绑定,它使分布式处理变得非常简单。

我已经看了多处理库但不知道如何利用它。

比如定义一个函数,process它读取单个目录中的图像,连接到数据库并存储元数据。让它返回一个表示成功或失败的布尔值。我们directories是目录处理的列表。然后

import multiprocessing
pool = multiprocessing.pool(multiprocessing.cpu_count())
success = all(pool.imap_unordered(process, directories))

将并行处理所有目录。如果需要,您还可以在文件级执行并行操作; 这需要更多的修修补补。

请注意,这将在第一次失败时停止; 使其容错需要更多的工作。


本文首发于,博客园同步更新