2013-06-27 61 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選項)執行整個操作服務器端。在選擇走這條路線之前,請注意警告(記錄在頁面底部附近)。