【问题标题】:Codeigniter Allowed memory size exhausted while processing large filesCodeigniter 处理大文件时允许的内存大小耗尽
【发布时间】:2014-04-30 06:21:26
【问题描述】:

我发布这个以防其他人正在寻找相同的解决方案,因为我只是在这个废话上浪费了两天时间。

我有一个 cron 作业,它每天使用一个非常大的文件更新数据库,使用以下代码:

if (($handle = fopen(dirname(__FILE__) . '/uncompressed', "r")) !== FALSE) 
{
    while (($data = fgets($handle)) !== FALSE) 
    {
        $thisline = json_decode($data, true);
        $this->regen($thisline);
    }
    fclose($handle);
}

这是在仅用于 cron 作业的 Codeigniter 控制器中。 $this->regen 函数运行一系列不同的检查,并将该行中的正确信息存储在数据库中。该文件本身包含超过 300MB 的 JSON,由换行符分隔。

问题:它只会处理大约 20,000 行,然后整个事情就会耗尽内存。

【问题讨论】:

  • 这很酷,但是......这可能应该尽快关闭,因为它不是一个“问题”。
  • 是的,我想是的。不过我没有这个能力,所以我得等别人来做。
  • @Cryan 您可以代替使用“解决方案”为此创建答案,然后将其标记为已回答;)
  • 哈,我不知道我们能做到这一点:P 感谢您的帮助。

标签: php database codeigniter memory activerecord


【解决方案1】:

我花了几个小时解决这个问题,但没有发现任何明显的问题。我正在使用 fgets,我在正确的地方有 $query->free_result()。它没有帮助。于是我开始检查大约 100 行的循环,并观察 memory_get_usage() 的输出。我最终将其范围缩小到 Codeigniter Active Record 类 - 每次调用该类都会导致内存使用量略微增加。

然后我在Ellislabs 上找到了这个帖子,我得到了答案。 CI Active Record 保存查询,以便您可以根据需要在多个函数中构建查询。 (我什至不打算在默认情况下打开它是多么愚蠢。)

转到/config/database.php并添加

$db['default']['save_queries'] = FALSE;

到文件末尾。然后确保在单个函数中使用 Active Record 构建和执行查询。如果您只需要在一种情况下将其关闭,请使用

$this->db->save_queries = FALSE;

在构造函数中或任何你需要的地方。

【讨论】:

  • 虽然在我知道要搜索什么之前我没有找到这个答案,但在工作中,有一个服务器处理了大量的 API 调用,并且几乎立即耗尽了 RAM,并在它的限制并杀死它的进程......这几乎是整个问题。 CI 有很多让我摇头的地方,但这一项花费了我们足够的时间和精力,以至于它可能就在顶部。
  • 绝对的救生员!!这做到了!谢谢!
  • wtf!?删除 save_queries 删除了我们所有的内存泄漏
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2018-08-04
  • 1970-01-01
相关资源
最近更新 更多