例如從兩張表中分別查出上百萬條資料,現在需要把這些資料組裝在一起然後在插入到另外一張表中,請問除了使用陣列組裝外還能怎麼處理,如果使用陣列的話怎麼才能保證不超出記憶體限制。
mysql_query函式查詢的方式是查詢出全部結果後快取到記憶體中,這樣就會出現超記憶體的現象,使用另外乙個函式mysql_unbuffered_query可以解決這個問題,mysql_unbuffered_query不會快取結果集,而是查詢出來資料後立馬對結果集進行操作,也就是便查詢邊返回,這樣就不會出現超出記憶體的現象,但是使用mysql_unbuffered_query的是時候不能使用 mysql_num_rows() 和 mysql_data_seek()。並且向 mysql 傳送一條新的 sql 查詢之前,必須提取掉所有未快取的 sql 查詢所產生的結果行。例如:
使用快取結果集的**:
function selecttest()
sleep(1);
print_r($result);
echo '占用記憶體大小:' . memory_get_usage() . "\n";
}
} catch (exception $e)
}
執行時將會報超出記憶體的錯誤:
fatal error: allowed memory size of 134217728 bytes exhausted (tried to allocate 204800000 bytes)
in e:\programdevelopment\runtimeenvironment\xampp\htdocs\test\test.php on line 56call stack: 0.0005 135392
1. () e:\programdevelopment\runtimeenvironment\xampp\htdocs\test\test.php:0
0.0005 135568 2. test->selecttest() e:\programdevelopment\runtimeenvironment\xampp\htdocs\test\test.php:85
0.0050 142528 3. pdostatement->execute() e:\programdevelopment\runtimeenvironment\xampp\htdocs\test\test.php:56
將上面**中的$pdo->setattribute(pdo::mysql_attr_use_buffered_query, false);一行的注釋去掉後將不在快取結果集,這時執行該函式的結果如下:
最初占用記憶體大小:144808array(
[id] => 1
[a] => v
[b] => w
[c] => i
)
占用記憶體大小:145544array(
[id] => 2
[a] => b
[b] => l
[c] => q
)
占用記憶體大小:145544array(
[id] => 3
[a] => m
[b] => p
[c] => h
)
占用記憶體大小:145536array(
[id] => 4
[a] => j
[b] => i
[c] => b
)
占用記憶體大小:145536
可以看到,這時返回一條資料記憶體占用非常的小,也就700多位元組,這樣就不會出現超出記憶體的錯誤了。
**
PHP處理大量資料不超出記憶體限制的問題
例如從兩張表中分別查出上百萬條資料,現在需要把這些資料組裝在一起然後在插入到另外一張表中,請問除了使用陣列組裝外還能怎麼處理,如果使用陣列的話怎麼才能保證不超出記憶體限制。mysql query函式查詢的方式是查詢出全部結果後快取到記憶體中,這樣就會出現超記憶體的現象,使用另外乙個函式mysql u...
PHP查詢MySQL大量資料的記憶體
這篇文章主要是從原理,手冊和原始碼分析在php中查詢mysql返回大量結果時,記憶體占用的問題,同時對使用mysql c api也有涉及。昨天,有同事在php討論群裡提到,他做的乙個專案由於mysql查詢返回的結果太多 達10萬條 從而導致php記憶體不夠用。所以,他問,在執行下面的 遍歷返回的my...
PHP查詢MySQL大量資料的記憶體
這篇文章主要是從原理,手冊和原始碼分析在php中查詢mysql返回大量結果時,記憶體占用的問題,同時對使用mysql c api也有涉及。昨天,有同事在php討論群裡提到,他做的乙個專案由於mysql查詢返回的結果太多 達10萬條 從而導致php記憶體不夠用。所以,他問,在執行下面的 遍歷返回的my...