PHP和Mongo - findOne()会导致内存耗尽

时间:2011-12-06 06:14:48

标签: php mongodb

我的PHP memory_limit是64M(开始时相当高)

我在我的PHP代码中调用了MongoCollection :: findOne(),我在MongoId中“找到一个”。 它适用于大多数情况。但是在某些情况下,它会导致PHP超过64M的memory_limit。

Mongo的数据记录最大为3.5MB,因为Mongo不允许超过4MB。

当我在调用findOne()之前运行memory_get_usage()时,它只有大约4MB。所以findOne()似乎消耗了其他60MB +。这是内存泄漏还是我在Mongo中存储的方式存在设计缺陷?

我的PHP Mongo驱动程序是最新的1.26

4 个答案:

答案 0 :(得分:1)

知道Mongo通过严格散列查找,并且任何给定ID的查找序列都是有限的,这绝对不可能是Mongo所做的。

如果您使用的是MongoID,那么您应该确定该ID有效。因为MongoID是给定记录的已解析哈希。

这可能是问题所在。或者我可能完全错了。

答案 1 :(得分:1)

我对你的具体案例不太了解;然而,这种情况多次发生在我身上使用mysql和cakephp。我从来没有用过php和mongo。请尝试以下方法:

A)您是否在数据库中设置了任何索引?
B)你可以通过php.ini增加你的内存限制,我的通常设置在256mb左右 C)可能是您的关联导致创建了大量对象的情况。我怀疑你的查询导致60mb填满,而是由于关联导致的一些递归混乱。在调用您的查询之前尝试解除绑定关联 D)关闭所有关联,然后慢慢上升。

我知道mongo应该不需要复杂的查询。也许这更像是语言/图书馆问题?

希望这有帮助!

答案 2 :(得分:1)

从shell中的相应集合中尝试db.<your collection>.validate()命令 尝试对该集合进行db.<your collection>.reIndex()调用 尝试删除所有索引并在该集合上重新创建它们(即使是所有集合;也不会伤害任何东西) 从shell中试用db.repairDatabase()

此外,从您的PHP代码中,尝试与find()相同的条件,看看是否内存损坏。

答案 3 :(得分:1)

如果您可以发布正在运行的确切代码,将会很有帮助。它很可能是您的代码,但它可能是Mongo PHP驱动程序的错误。最新版本的驱动程序(1.2.9)似乎比以前的版本倒退了一步。我自己在驱动程序中发现了一个错误导致php在连接超时时出现段错误:o在我与10gen开发人员进行的对话中,向我透露,php驱动程序是所有语言中最不成熟的,但我被告知他们刚刚聘请了一位php开发人员,所以司机们很快就会得到一些爱。