我的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
答案 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开发人员,所以司机们很快就会得到一些爱。