首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSV到数组函数的内存泄漏

CSV到数组函数的内存泄漏
EN

Stack Overflow用户
提问于 2015-04-21 10:07:35
回答 1查看 103关注 0票数 1

作为导入类的一部分,我们使用这个csvToArray函数。过去它运转得很好,但现在它“坏了”。

我们得到一个“允许内存大小为134217728字节耗尽(试图分配78字节)”错误。

代码语言:javascript
复制
private function _csvToArray($filename='', $delimiter=',')
{
    if(!file_exists($filename) || !is_readable($filename))
        return FALSE;
    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE)
    {
        while (($row = fgetcsv($handle, 0, $delimiter)) !== FALSE)
        {
            if(!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row); // THIS IS THE LINE WHERE THE ERROR OCCURS
        }
        fclose($handle);
    }
    return $data;
}

这可能意味着文件变得很大,但是自从我们开始使用这个脚本之后,它只增加了5行.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-21 10:27:39

如果将$header行存储一次并用作索引,则需要更少的内存。实际上,表中的每个非标头行都将有一个头字符串的副本作为键。通过将while循环更改为以下内容,您可以将内存使用量减半(几乎):

代码语言:javascript
复制
    while (($row = fgetcsv($handle, 0, $delimiter)) !== FALSE)
    {
        if(!$header) {
            $header = $row;
            $flipheader = array_flip($header);
        }
        else
            $data[] = $row;  // Just the data
    }

然后引用翻转的标头索引来查找值,如下所示:

代码语言:javascript
复制
$index = $flipheader['columnName'];  // if you need to lookup rows by column name
$value = $data[0][$index];

如果只需要在格式化输出时使用标头字符串,而不需要查找值,则更简单,因为可以使用数字索引来获取值,并在需要时使用相同的索引来访问$header字符串。在这种情况下,您将不需要$flipheader变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29769097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档