簡體   English   中英

PHP MongoDB findOne內存泄漏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM