[英]PHP MongoDB findOne Memory Leak
我發現了一些有關php mongodb驅動程序內存泄漏問題的老帖子。 但是沒有人為php mongodb驅動程序的較舊版本提供最終解決方案或說明。
我的驅動程序版本是PHP 5.3.10的1.4.5(穩定)版本
帶有調試回顯的代碼:
echo memory_get_usage()." in MB : ";
echo memory_get_usage()/1024/1024;
echo "<br>";
unset($cursor);
$dt = new DateTime($day." 00:00:00", new DateTimeZone($this->timezone));
$mongodate = new MongoDate($dt->getTimestamp());
// print_r($mongodate);
$cursor = $dc->findOne(array('keyword' => $keyword, 'date' => $mongodate));
echo "Cursor loaded Doc (".$cursor['_id'].") : ";
echo memory_get_usage()." in MB : ";
echo memory_get_usage()/1024/1024;
echo "<br>";
**回顯真實內存使用情況**
3932160 in MB : 3.75
Cursor geladen Doc (534cdee3c30fd1b8ee0bb641) : 218305980 in MB : 208.1928062439
帶調試的代碼回顯真實內存使用情況:
echo memory_get_usage(true)." in MB : ";
echo memory_get_peak_usage(true)/1024/1024;
echo "<br>";
unset($cursor);
$dt = new DateTime($day." 00:00:00", new DateTimeZone($this->timezone));
$mongodate = new MongoDate($dt->getTimestamp());
// print_r($mongodate);
$cursor = $dc->findOne(array('keyword' => $keyword, 'date' => $mongodate));
/*
echo "<pre>";
print_r($cursor);
echo "</pre>";
*/
echo "Cursor loaded Doc (".$cursor['_id'].") : ";
echo memory_get_usage(true)." in MB : ";
echo memory_get_peak_usage(true)/1024/1024;
echo "<br>";
**回顯真實內存使用情況**
3932160 in MB : 3.75
Cursor loaded Doc (534cdee3c30fd1b8ee0bb641) : 218628096 in MB : 224.5
因此,只有一個文檔會導致200 MB以上的內存增加。
bitrs3:PRIMARY> var doc = db.dailies.findOne({"_id" : ObjectId("534cdee3c30fd1b8ee0bb641")})
bitrs3:PRIMARY> Object.bsonsize(doc)
16754823
加載的文檔確實不小,它具有16754823字節,因此達到16 MB的最大Bson大小
我仍然想知道,從結果中創建數組的findOne +游標操作是否需要這么多內存是正常的。
您可以通過序列化數組(使用serialize()甚至json_encode())並將其保存到文件中,來驗證這是否是“使用PHP進行交易的成本”,或者是否已在驅動程序中找到錯誤。
然后,您反序列化()(或json_decode())文件的內容並檢查內存使用情況。 如果內存使用量相似,您會看到PHP輸入的實際開銷。
<?php
$mc = new MongoClient;
$collection = $mc->selectCollection("myDB", "myCollection");
$d = $collection->findOne(array("my" => "criteria"));
var_dump(memory_get_usage() / 1024 / 1024);
file_put_contents("serialized.bin", serialize($d));
?>
然后再次加載:
<?php
$val = unserialize(file_get_contents("serialized.bin"));
var_dump(memory_get_usage() / 1024 / 1024);
?>
編輯 :搶先澄清任何誤會。 一個16Mb的MongoDB文檔通常不需要數百兆的內存。
但是,如果在該對象中有成千上萬個元素,則單個元素的開銷開始計算您擁有的每個元素的次數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.