我试图理解为什么单个PDO结果的内存使用率如此之高。以下是有关查询/结果的一些信息:
VARCHAR(6)
列memory_get_usage
)json_encode
结果并将其转储到文件中,实际数据(文本形式)只有~1MB 我的问题是,11MB的膨胀到底在哪里?如果文本形式的实际数据只有大约1MB,那么11MB似乎只是为了解析PHP中的数据而花费很多。是否有一个原因?我错过了什么吗?
编辑:
为了澄清,我正在寻找技术解释为什么存在膨胀,而不是问题的解决方法。
答案 0 :(得分:3)
好的,感谢Ollie Jones的回答,我意识到我一直在寻找错误的地方来获取我的信息。这不是PDO内存使用问题,但是PHP存储其数组的方式存在问题。 (也许问题不是正确的词,它就是它)
经过一番挖掘后,我发现了这篇非常有用的文章,它详细介绍了PHP如何为数组元素分配内存:
https://nikic.github.io/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html
Spoiler alert,它为每个元素使用TON内存。显然它在PHP7中已经变得更好了。文章指出,对于一个简单的整数数组(在PHP5中),它将使用大约18倍于整数本身大小的内存。由于我看到关联字符串数据增加了12 *,因此id表示这确实是对PHP5的巨大改进。
根据该文章,正在为以下内容分配内存:
zvalue_value
union,与PHP允许的弱类型转换相关如果您对此也有兴趣,我强烈建议您阅读该文章,快速阅读并提供大量有用信息。
再次感谢Ollie Jones指出我正确的方向。
答案 1 :(得分:2)
如果没有看到具体的代码,很难给出具体的答案。话虽如此,像数组这样的PHP数据结构是关联的。 PHP设计人员故意做出权衡,使用额外的RAM来节省阵列访问时间。
您可以通过多种方式节省内存。首先,您可以将结果集的每一行作为数字而不是关联数组获取。读这个。 http://php.net/manual/en/mysqli-result.fetch-array.php
另一方面,PHP会立即篡改结果集中的所有行,除非你告诉它不要。这种slurp操作消耗了大量的RAM。如果您计划一次处理一行大型结果集,则不需要这样做。您需要无缓冲查询才能执行此操作。阅读:http://php.net/manual/en/mysqlinfo.concepts.buffering.php