在以下 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);
我认为没有其他选择,如果你有一个迭代器并且你想要一个数组,你需要迭代迭代器并将值传递给数组,你可以自己使用foreach
或者你可以使用iterator_to_array
,但是如果你有很多元素在迭代器中,该过程是耗时的。
您的第一个查询实际返回了多少行?据推测,总数据小于 16MB,因为您将其存储到新文档的一个字段中。
您的分析是否表明延迟是在网络 IO 中还是在构建阵列?游标迭代实际上需要两者兼而有之。如果您在服务器端看到大量getmore
操作,您可以使用MongoCursor::batchSize()进行调整以减少网络往返。这将控制迭代期间驱动程序一次请求的文档数量。默认情况下,驱动程序将使用 101 的批处理大小,因此如果您的结果包含大量微小的文档,那么您会预期会有许多带有微小有效负载的往返。每个返回的实际文档数量getmore
将限制为 4MB 或批量大小,以较小者为准。
除了增加批量大小之外,find()
如果您只对某些字段感兴趣,您可能还需要添加投影。
或者,如果这是一个很少使用的查询并且您想避免网络 IO,您可能需要考虑使用eval 命令(和nolock
选项)在服务器端执行整个操作。在选择走这条路线之前,请注意注意事项(记录在页面底部附近)。