【问题标题】:PHP and Mongo - findOne() causes memory exhaustionPHP 和 Mongo - findOne() 导致内存耗尽
【发布时间】:2011-12-06 06:14:47
【问题描述】:

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

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

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

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

我的 PHP Mongo 驱动是最新的 1.26

【问题讨论】:

  • 你有没有向 MongoCollection::findOne() 提供任何东西?
  • 代码是这样的:$cond = array('_id' => new MongoId('4e76e544546ba04617000000')); $record = $objCollection->findOne($cond); // memory exhaustion in this line
  • 您尝试传入缩放器值(ID 的字符串)而不是对象如何?
  • 致命错误:允许的内存大小为 68157440 字节已用尽(试图分配 71 字节) 这就是错误消息。在这种情况下,Mongo 的 findOne() 内部会耗尽所有内存。
  • 您能否包含一些 JSON 来记录?我很难相信这是 Mongo。

标签: php mongodb


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我不太了解您的具体情况;但是,我使用 mysql 和 cakephp 多次发生这种情况。不过,我从来没有在 php 中使用过 mongo。请尝试以下操作:

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

      我知道 mongo 应该消除对复杂查询的需求。也许这更多的是语言/图书馆问题?

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:

        在 shell 的相应集合上尝试 db.<your collection>.validate() 命令。
        尝试在集合上拨打db.<your collection>.reIndex()
        尝试删除所有索引并在该集合上重新创建它们(甚至所有集合;不会伤害任何东西)。
        从外壳尝试db.repairDatabase()

        另外,在您的 PHP 代码中,尝试使用与 find() 相同的条件,看看是否出现内存损坏。

        【讨论】:

          猜你喜欢
          • 2019-05-16
          • 2023-03-05
          • 2011-05-06
          • 2015-07-02
          • 2012-12-09
          • 1970-01-01
          • 2015-10-01
          • 1970-01-01
          相关资源
          最近更新 更多