首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何并行:6台机器,800万台独立文档在数据库中进行处理

如何并行:6台机器,800万台独立文档在数据库中进行处理
EN

Stack Overflow用户
提问于 2014-06-18 07:30:33
回答 1查看 57关注 0票数 0

背景:

我在数据库中有800万份独立文档需要处理。文档之间不相互依赖,这意味着进程可以并行化。处理完一个文档后,结果将保存回数据库。

有6台机器供我使用。

电流溶液

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

现在,我将这些行平均划分为6个共享,每个共享供一台机器处理。

当前解决方案的缺陷

一些分区可能需要更长的时间来处理,因此有些机器在空闲时会很忙。

需求

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

回答 1

Stack Overflow用户

发布于 2014-06-18 08:10:31

与其将行划分为相等的共享,不如向文档表中添加一个进度字段(您应该真正创建一个进度表,并执行一个外部连接,但是您会有这样的想法)。然后,在每个工作人员中,首先预订一个文档块(假设id是主键,WORKERID是每个工作人员的唯一id ):

代码语言:javascript
复制
update documents set progress = WORKERID
where progress is null
limit 1000

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

确保您的限制足够大,使您的数据库有一些喘息空间,但不太大,您将不得不等待最后的工人完成他的第10000份文件:-)

然后您可以开始迭代:

代码语言:javascript
复制
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语句手动监视进度:

代码语言:javascript
复制
select progress, count(*)
from documents
group by progress
order by progress

这将给出剩下多少个(进步= null),有多少完成(progress = 'done'),以及每个工人队列中有多少(progress = WORKERID)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24279528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档