【问题标题】:PHP oci_fetch_array causing out of memory errorPHP oci_fetch_array 导致内存不足错误
【发布时间】:2015-09-11 16:13:22
【问题描述】:

我正在运行查询并使用OCI_FETCH_ARRAY 进行检索,我遇到了一个致命错误,在我达到一定数量的记录后内存不足。结果数组是 100k 行和大约 60 列。
我将 php.ini 中的 memory_limit 设置为 2 gigs。

memory_limit = 2056M

当我有多个人同时运行脚本(或同一个人运行两次,因为它被设置为在后台运行)时,似乎会发生这种情况。 只需要 2 个 100k 记录的并发作业即可导致错误。 我在 OCI_FETCH_ARRAY 上找到的所有内容都表明它没有将整个结果集缓存到内存中,但看起来确实如此。

这是我的代码(非常直接)

while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
    array_push($resultfile,$row);
    $tablerow=$tablerow +1;
    unset($row);
}

OCI_FETCH_ARRAY 语句在达到一定数量的循环后发生错误。

输出文件只有 94m(平均),所以我似乎不应该受到内存限制。

【问题讨论】:

  • 您正在构建一个巨大的 in-memory 数组 ($resultfile) 并没有帮助....在阅读时处理每条记录要好得多它而不是将其存储在一个不断增长的数组中,然后处理该数组
  • 谢谢马克,知道为什么它只在 oci_fetch_array 调用上失败而不是在 array_push 上失败吗?其次,文件是 94mb,如果我将 memory_limit 设置为 2gb,为什么 3 个并发实例会导致内存问题。
  • 一个数组中有 100k 行,每行 60 列....这是 100k 个数组,有 600 万个值....每个数组和每个元素的典型开销为 48 字节在添加数据本身的大小之前使用 6,100,000 * 48 字节

标签: php oracle out-of-memory


【解决方案1】:

以下代码导致高内存使用:

array_push($resultfile,$row);

oci_fetch_array 是无缓冲的,这意味着它将一一获取行,直到没有行存在。我建议不要将行推入另一个数组。而是在 while 循环本身中编写您的逻辑。

【讨论】:

    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 2011-05-05
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    相关资源
    最近更新 更多