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);
4

2 回答 2

1

我认为没有其他选择,如果你有一个迭代器并且你想要一个数组,你需要迭代迭代器并将值传递给数组,你可以自己使用foreach或者你可以使用iterator_to_array,但是如果你有很多元素在迭代器中,该过程是耗时的。

于 2013-06-27T16:58:40.050 回答
1

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

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

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

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

于 2013-06-27T19:32:23.463 回答