2011-12-06 27 views
12

我的PHP memory_limit的是64M(這是相當高,開始)PHP和蒙戈 - findOne()導致內存消耗殆盡

我有一個MongoCollection :: findOne()調用我的PHP代碼,我「找到一個「由MongoId。 它適用於大多數情況。但是在某些情況下,它會導致PHP超過64M的memory_limit。

Mongo中的數據記錄最大值爲3.5MB,因爲Mongo不允許超過4MB。

當我運行時,調用findOne()之前的memory_get_usage(),它只有約4MB。所以findOne()似乎已經消耗了其他60MB +。這是內存泄漏還是我在Mongo中存儲的方式存在設計缺陷?

我的PHP蒙戈驅動程序是最新的1.26

+0

你有沒有提供任何東西給MongoCollection :: findOne()? – ajreal

+0

是的,提供「_id」 –

+0

_id是什麼樣的價值? – ajreal

回答

1

如果您可以發佈您正在運行的確切代碼,這將有所幫助。這很可能是你的代碼,但是它有可能是Mongo PHP驅動程序的一個bug。最新版本的驅動程序(1.2.9)似乎比以前的版本向後退了一步。我自己在驅動程序中發現了一個錯誤,導致php在連接超時時發生段錯誤:o在與10gen開發人員進行的對話中,我發現PHP驅動程序是所有語言中最不成熟的,但我被告知他們只是僱傭了一名PHP開發人員,所以司機應該很快就會獲得一些愛。

1

知道了蒙戈通過嚴格的哈希查找,這對於任何給定ID查找序列是有限的,是絕對沒有辦法這可能是蒙戈的做。

如果您使用的是MongoID,那麼您應該是肯定該ID是有效的。因爲MongoID是給定記錄的解析散列。

這可能是問題所在。或者我可能完全錯誤。

1

我不太瞭解您的具體情況;然而,這發生在我身上多次使用mysql和cakephp。儘管我從來沒有用過mongo。請嘗試以下操作:

A)您是否在數據庫中設置了任何索引?
B)你可以通過php.ini增加你的內存限制,我的設置通常在256mb左右。 C)可能出現這種情況,您的關聯會導致創建一組對象。我懷疑你的查詢是導致60mb填滿,而是由於關聯的一些遞歸混沌。在調用查詢之前嘗試解除綁定關聯。 D)關掉所有的關聯,慢慢地上升。

我知道mongo應該消除對複雜查詢的需求。也許這更像是語言/圖書館的問題?

希望這會有所幫助!

1

從shell中嘗試各自集合的db.<your collection>.validate()命令。
嘗試在集合上調用db.<your collection>.reIndex()
嘗試刪除所有索引並在該集合上重新創建它們(甚至是所有集合;不會傷害任何東西)。
從shell中嘗試db.repairDatabase()

此外,從您的PHP代碼中,嘗試與find()相同的標準並查看是否得到內存損壞。