2013-07-26 60 views
0

我是一個新手,當涉及到Mongo和Elasticsearch,我有一個問題。從Mongo刪除到Elasticsearch

我將Mongo的集合移動到ES索引。收藏有三千萬份文件。最初,劇本迅速而不間斷地移動了15千萬個文件。經過15個百萬次後,「500內部錯誤」更頻繁地出現。我能夠在PHP腳本的幫助下移動28萬個文件,之後我得到「500內部錯誤」。錯誤日誌是空的。 PHP的內存限制設置爲1,2 GB,我無法放大。腳本的

片段,其中錯誤顯示出來看起來是這樣的:

$db->createCollection($collectionName); 
$collection = new MongoCollection($db, $collectionName); 
$cursor = $collection->find()->skip($nextPortion)->limit($pageing); 
while ($value = $cursor->getNext()) 
{ 
     ........... 
    make JSON 
    ........... 
} 

腳本無法通過此行移動。在這一行我得到服務器錯誤:

while ($value = $cursor->getNext()) 

我使用ES中的批量API移動文件。

有沒有什麼辦法通過增加PHP內存來完成移動文件?

謝謝你的幫助。

回答

0

你可以分批做,而不是一次全部做,無論長時間運行cronjob evrery 5分鐘。這意味着您不太可能因網絡和光標壽命而遭受問題。

另外使用skip()對於2800萬條記錄可能是一個壞主意,我不確定$nextPortion是什麼,但與所有這些記錄結合使用並不是一件好事。

+0

@ user2622824我肯定會使用_id的範圍來代替,這可能是導致問題的原因 – Sammaye

+0

此外,這不是應通過Web服務器執行的操作(以「500服務器錯誤」作爲提示)。當涉及到腳本執行時間時,CLI環境中的PHP應該更加靈活。 MongoCursor的生命週期可以用[MongoCursor :: timeout()](http://www.php.net/manual/en/mongocursor.timeout.php)進行調整,但除非提供實際的錯誤,否則很難確定原因。空錯誤日誌可能是配置問題的結果。我期望['$ cursor-> hasNext()'](http://www.php.net/manual/en/mongocursor.hasnext.php)拋出超時異常。 – jmikola