簡體   English   中英

從MySQL提取大型數據集時PHP中的內存泄漏

[英]Memory leak in PHP when fetching large dataset from MySQL

當我為大約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的內存限制-這是一個壞主意,更重要的是,仍然會限制使用此技術可以處理多大數據集。

我不確定100%是否可以解決您的問題,但是您是否考慮過使用PDO 它具有幾個優點; 您可以在此處閱讀有關它們的更多信息。 如果你往那個方向,有關於內存使用一個類似的問題在這里

mysql_query將整個結果集緩沖到php內存中。 這很方便並且通常非常快,但是您遇到了一個缺點。

mysql_unbuffered_query ()存在。 它不會一次獲取全部結果集。 當您從結果集中獲取行時,它一次抓取一些小片段。

我有類似的問題。 我要做的就是創建一個臨時文件(您可以使用哈希或類似的方法來保存名稱記錄)。

  • 拉10,000行並將其放入文件(臨時)。 將其放入臨時csv文件中。
  • 重新加載頁面(使用帶有特定參數/會話的標頭)
  • 再拉10,000行並將其附加到文件中。
  • 當您到達表的末尾時-緩沖文件給用戶。

像這樣繞圈走,直到掌握全部。 我不得不做此工作有兩個原因,

  1. 超時
  2. 內存不足錯誤。

該方法的缺點是它需要許多HTTP調用才能獲取數據。 同時,也可能有行已更改等。這是一種非常“骯臟”的方式。 我還沒有找到更好的方法。 希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM