2013-06-27 60 views
3

在下面的PHP脚本中iterator_to_array效率极低(我使用了一个分析器)。下面的代码是否有更好的选择?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); 

回答

0

我认为没有其他选择,如果你有一个迭代器,你想一个数组,你需要遍历迭代器和值传递给数组,你可以自己使用foreach做到这一点,或者你可以使用iterator_to_array,但如果迭代器中有许多元素,则该过程非常耗时。

1

您的第一个查询实际返回了多少行?据推测,总数据少于16MB,因为您将它存储在新文档的一个字段中。

您的分析表明延迟是在网络IO还是在构建阵列?游标迭代实际上需要一点点。如果您在服务器端看到大量的getmore操作,则可以使用MongoCursor::batchSize()来调整,以减少网络往返。这将控制驱动程序在迭代期间一次请求的文档数量。默认情况下,驱动程序将使用101的批处理大小,所以如果结果包含大量小文档,则可能会出现许多带有微小有效载荷的往返行程。根据getmore返回的文件的实际数量将限制为4MB或批量大小,以较小者为准。

除了增加批量大小外,如果只有某些字段对您感兴趣,您可能需要为find()添加投影。

或者,如果这是一个很少使用的查询,并且您希望避免网络IO,则可能需要考虑使用eval command(和nolock选项)执行整个操作服务器端。在选择走这条路线之前,请注意警告(记录在页面底部附近)。