2013-06-26 60 views
1

我有PHP在Apache上運行的PHP。我有一個簡單的腳本,簡單地做一個查詢,從數據庫中拉出一堆緯度,經度對,將它們存儲到一個數組中,然後echo出JSON。只處理幾MB的陣列時使用超過512MB的PHP腳本

該陣列出來約有40,000個元素。在陣列中的一個條目看起來像這樣

{"lat":"41.951234015","lng":"-87.5317308"}. 

查詢是通過一個MSSQL數據庫MySQL的數據庫使用鏈接的服務器,如果是相關的。

如果我做ini_set('memory_limit', '512M') PHP耗盡內存,但如果我做ini_set('memory_limit', '1024M')成功。

爲什麼這個腳本佔用了太多內存?一個40,000個元素的數組,每個元素不超過20個字符,應該只佔用幾MB的內存。我沒有做陣列上的任何處理。

編輯:這裏是我的代碼

mssql_query("SET ANSI_WARNINGS ON"); 
mssql_query("SET ANSI_NULLS ON"); 

ini_set('memory_limit', '1024M'); 
$cbsa='16980'; 
if(isset($_POST['cbsa'])){ 
    $cbsa = sanitize($_POST['cbsa']); 
} 

$zipstrings = get_zipstring($cbsa); //external function that returns two lists of about 500 zipcodes each 

$lat_lng = array(); 
foreach($zipstrings as $zipstring){ 
    $result = mssql_query("select * from openquery(database, 'SELECT lat, lng from coordinates 
    JOIN with other table...."); 
    while($row = mssql_fetch_array($result, MSSQL_ASSOC)){ 
     $lat_lng[] = array("lat"=>$row['lat'], "lng"=>$row['lng']); **CRASHES HERE** 
    } 
} 
echo json_encode(array("coords"=>$lat_lng, "error"=>mssql_get_last_message())); 
+0

我們不能在你的代碼中查找內存泄漏代碼 – user20232359723568423357842364

+0

發佈你的代碼... –

+0

@ user20232359723568423357842364你爲什麼不改變你的用戶名LOL。 Scott W:你能發佈你的代碼嗎?你可能有一個循環卡在某個地方..該大小的4萬個元素只有2MB。 –

回答

0

多少數據確實該查詢返回?如果你有一個select * from opendata,如果它有很大的列,並且其中很多會是原因。你的代碼對我來說好像

+0

我只選擇了兩列(lat,lng)。 select *是因爲我必須通過MSSQL查詢MYSQL數據庫,所以查詢基本上是說「select * from(select lat,lng)」 –

+0

爲什麼抽象?爲什麼不直接? – exussum

+0

由於無法控制權限和安全問題,我無法直接查詢MySQL數據庫,但必須通過MSSQL和「鏈接服務器」。 –