背景:
我在数据库中有800万份独立文档需要处理。文档之间不相互依赖,这意味着进程可以并行化。处理完一个文档后,结果将保存回数据库。
有6台机器供我使用。
电流溶液
文档使用MySQL中的一个表存储。
现在,我将这些行平均划分为6个共享,每个共享供一台机器处理。
当前解决方案的缺陷
一些分区可能需要更长的时间来处理,因此有些机器在空闲时会很忙。
需求
发布于 2014-06-18 08:10:31
与其将行划分为相等的共享,不如向文档表中添加一个进度字段(您应该真正创建一个进度表,并执行一个外部连接,但是您会有这样的想法)。然后,在每个工作人员中,首先预订一个文档块(假设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这将给出剩下多少个(进步= null),有多少完成(progress = 'done'),以及每个工人队列中有多少(progress = WORKERID)。
https://stackoverflow.com/questions/24279528
复制相似问题