关于迭代器的操作

2015-06-29 09:59:39 +08:00
 aragakiiyui
我想问一下各位大神有没有什么方法更快的去遍历一个迭代器。

我要处理的一个Iterators大概包含了将近900万个元素。如果直接用 for ... in ... 的方式去遍历,根本无法再规定的时间内完成需求。
我目前是用iteratool.islice去做,每个线程切1000个出来,转成列表来处理,但是几乎没什么提升。而且转换成list这个操作也很耗时间....有没有什么方法可以多线程去取里面的元素?或者有没有什么其他好的方法或者经验?
3176 次点击
所在节点    Python
27 条回复
nullcc
2015-06-29 16:00:48 +08:00
考虑下map reduce?
aragakiiyui
2015-06-29 16:05:00 +08:00
@nullcc 用多进程么?!
neoblackcap
2015-06-29 16:12:53 +08:00
@aragakiiyui 你这个工作差不多都已经完全是分布式了,你至少是用多进程啊。队列只是拿worker要完成那种任务的条件而已,

就好像你告诉worker要去处理1-1000的记录,worker2处理2000-3000的记录,但是具体的信息还是要通过es去读(每个worker独自建个连接连es来获取信息)。若是你的数据没有依赖关系的话,即worker1处理完的内容可以直接写入数据库,那么你就完全连合并的server端都省了,worker直接写数据库就可以了。这样下来效率应该很高才对啊。处理完全是分布式啊,最大的瓶颈就是磁盘IO而已。即es的读或者数据的写
clino
2015-06-29 16:19:07 +08:00
"我要处理的一个Iterators大概包含了将近900万个元素"
把元素分段,然后这样可以用多个 iterator 来不重复地遍历,这样就可以多线程或者多进程地并行了
nullcc
2015-06-29 16:32:35 +08:00
@aragakiiyui 怎么说呢。。map reduce是一种编程模型,有分布式的概念了
julyclyde
2015-07-01 18:06:19 +08:00
先把迭代器list化,然后再用slice的话小心内存占用量哦
aragakiiyui
2015-07-01 19:02:53 +08:00
@neoblackcap @clino 我多进程也试了,我把那块大的数据分成了2块,然后跑两个进程,发现比单进程慢的多。然后我又试了分成四块,跑四个线程,依然不如单线程跑。。我的机器实在太渣了。。瓶颈确实在IO上面。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/201846

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX