gpt4 book ai didi

python - 如何并行处理数据库中的: 6 machines, 800万个独立文档

转载 作者:行者123 更新时间:2023-11-30 00:08:43 24 4
gpt4 key购买 nike

背景:

我的数据库中有 800 万个独立文档需要处理。这些文档彼此不依赖,这意味着该过程可以并行化。处理完一份文档后,将结果保存回数据库。

有 6 台机器供我使用。

当前解决方案

文档使用 MySQL 中的一张表存储。

我现在将行平均分为 6 份,每份供一台机器处理。

当前解决方案的缺点

某些分区可能需要更长的时间来处理,从而导致一些机器在其他机器空闲时忙碌。

要求

  1. 我想找到一种方法/框架来有效地平衡任务负载
  2. 我使用 Python 作为数据处理工具,因此希望有适合 Python 的工具。

最佳答案

您应该向文档表添加一个进度字段,而不是将行划分为相等的份额(您实际上应该创建一个进度表并执行外连接,但您会明白这个想法)。然后,在每个工作人员中,您首先预订一组文档(假设 id 是主键,WORKERID 是每个工作人员的唯一 ID):

update documents set progress = WORKERID
where progress is null
limit 1000

(如果您使用旧版本的 MySQL,您可能需要更复杂的语法: update multiple rows using limit in mysql? )

确保您的限制足够大,以便您的数据库有一些喘息空间,但又不能大到您必须等待最后一个工作人员完成他的第 10000 个文档:-)

然后你可以开始迭代:

c.execute("select * from documents where progress = %s", my_worker_id)
for doc in c.fetchall():
# process doc..
c.execute("update documents set progress = 'done' where id = %s", doc.id)
cn.commit()

这具有非常容易实现、非常快的优点,并且使您能够重新启动任何工作器等。

如果你只有 6 个工作线程,我会手动启动它们。

哦,您可以使用简单的 sql 语句手动关注进度:

select progress, count(*)
from documents
group by progress
order by progress

这将为您提供剩余的数量(progress = null)、已完成的数量(progress = 'done')以及每个工作队列中有多少数量(progress = WORKERID)。

关于python - 如何并行处理数据库中的: 6 machines, 800万个独立文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24279528/

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