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

2021-08-26 23:51:26 字數 2925 閱讀 2919

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

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