当我为大约60,000条记录的用户表执行以下代码时:
mysql_connect("localhost", "root", "");
mysql_select_db("test");
$result = mysql_query("select * from users");
while ($row = mysql_fetch_object($result)) {
echo(convert(memory_get_usage(true))."\n");
}
function convert($size) {
$unit=array('b','kb','mb','gb','tb','pb');
return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
我收到以下错误:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes)
关于如何避免让脚本在每次循环中占用额外内存的任何想法?在我的实际代码中,我正在尝试为大型数据集提供CSV下载,并进行一些PHP预处理。
请不要建议增加PHP的内存限制 - 这是一个坏主意,更重要的是,仍然会对使用此技术处理数据集的大小产生上行限制。
答案 0 :(得分:1)
答案 1 :(得分:1)
mysql_query将整个结果集缓冲到php内存中。这很方便,而且通常非常快,但你遇到了一个缺点。
mysql_unbuffered_query()存在。它不会一次性获取整个结果集。当您从结果集中获取行时,它会抓取一些小块。
答案 2 :(得分:0)
我遇到过类似的问题。我做的是让它工作是创建一个临时文件(你可以使用哈希或类似的东西来保存名称的记录)。
直到你得到它为止,直到这样。我必须做这项工作有两个原因,
缺点是需要许多HTTP调用才能获取数据。同时也可能有行已经改变等等。这是一种非常“脏”的做法。我还没找到更好的东西。希望有所帮助。