PHP處理大量資料不超出記憶體限制的問題

2021-08-09 11:13:42 字數 1876 閱讀 9382

例如從兩張表中分別查出上百萬條資料,現在需要把這些資料組裝在一起然後在插入到另外一張表中,請問除了使用陣列組裝外還能怎麼處理,如果使用陣列的話怎麼才能保證不超出記憶體限制。

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...