[英]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的內存限制-這是一個壞主意,更重要的是,仍然會限制使用此技術可以處理多大數據集。
mysql_query將整個結果集緩沖到php內存中。 這很方便並且通常非常快,但是您遇到了一個缺點。
mysql_unbuffered_query ()存在。 它不會一次獲取全部結果集。 當您從結果集中獲取行時,它一次抓取一些小片段。
我有類似的問題。 我要做的就是創建一個臨時文件(您可以使用哈希或類似的方法來保存名稱記錄)。
像這樣繞圈走,直到掌握全部。 我不得不做此工作有兩個原因,
該方法的缺點是它需要許多HTTP調用才能獲取數據。 同時,也可能有行已更改等。這是一種非常“骯臟”的方式。 我還沒有找到更好的方法。 希望能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.