iterator_to_array 太慢了

5
在以下PHP脚本中,iterator_to_array非常低效(我使用了一个分析器)。是否有更好的替代方案来代替以下代码?
$new = [];
$rows=(new Mongo())->table1->find(['foo' => 'bar'),
$new['string'] = iterator_to_array($rows);  //Time-consuming part
(new Mongo())->table2->save($new);
2个回答

1

我认为没有其他选择,如果你有一个迭代器并且想要一个数组,你需要遍历迭代器并将值传递给数组,你可以使用 foreach 自己完成,也可以使用 iterator_to_array,但是如果迭代器中有许多元素,则这个过程会耗费时间。


1
你的第一个查询实际返回了多少行?可能总数据量小于16MB,因为你将其存储到新文档的一个字段中。
你的分析是否表明延迟出现在网络IO还是构建数组上?游标迭代实际上会涉及两者。如果在服务器端看到大量的getmore操作,可以使用MongoCursor::batchSize()进行调整以减少网络往返次数。这将控制驱动程序在迭代期间一次请求的文档数量。默认情况下,驱动程序将使用101个批处理大小,因此如果结果由大量微小文档组成,则会出现许多具有微小有效负载的往返。每个getmore实际返回的文档数将限制为4MB或批处理大小,以较小者为准。
除增加批处理大小外,如果只对某些字段感兴趣,您可能还想向find()添加投影。

或者,如果这是一个很少使用的查询,并且您想避免网络IO,您可能希望考虑使用eval命令(和nolock选项)在服务器端执行整个操作。只需注意在选择该路线之前的注意事项(在页面底部记录)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接