2013-05-28 114 views
2

我正在將數據從365 csv文件加載到highstock製圖api中。我使用PHP讀取csv文件並創建數組來保存信息。但我遇到了:如何在不使用數據庫的情況下處理大量數據?

Fatal error: Allowed memory size of 67108864 bytes exhausted

我該如何解決這個問題?


希望創造這個圖:

http://www.highcharts.com/stock/demo/compare

+0

直到您提供您正在解決的實際任務之前,無法提供解決方法。 PS:「允許php分配更多的內存並在服務器上安裝額外的內存」算作答案? – zerkms

+0

@zerkms你是什麼意思? – Willow

+0

我的意思是 - 除非給出徹底的任務解釋,否則不可能提供優化建議。優化沒有銀彈,每種情況都是獨一無二的。 PS:雖然有一些經驗法則,例如:儘可能減少內存中的數據,並在不再需要時儘快刪除數據 – zerkms

回答

2

,而不是代表內存中的所有的陣列,它可能只是爲了更好地直奔JSON文件與它。我將假設您需要的數據是包含時間戳+6浮點字段的2維多維數組。

不知道很多關於如何將信息提供給制圖API的細節是第一次刺。

$tmpFile = tempnam("tmp/","highchart_"); 
$out = fopen($tmpFile, "w"); 
// we are not going to use json encode because it requires us to hold the array in memory. 
fputs($out, "["); 
for($i=0;$i<count($files);$i++){ 
    if (($handle = fopen($files[$i], "r")) !== FALSE) { 
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
      // You may be able to get arround the timestamp calculation by just saying 
      $timestamp = strtotime($data[0]." ".$data[1]); 
      fputs($out, "[".(int)$timestamp.",".(float)$data[2].",". 
          (float)$data[3].",".(float)$data[4].",".(float)$data[5].",".(float)$data[13]."]"); 
     } 
     fclose($handle); 
    } 
} 
fputs($out, "]"); 
fclose($out); 

現在在$tmpFile文件將包含一個JSON編碼數組,你可以就用的ReadFile或fpassthru才能到瀏覽器。此外,我會敦促你使用某種緩存機制,而不是將它們存儲在臨時文件中。 + 67MB的數據對於每個請求來說都是相當不錯的。

+0

夢幻般的想法。我認爲圖形API喜歡json文件。我試圖避免它們,因爲我以前從未使用過json。它討論了json在這裏的設置:'http:// docs.highcharts.com /#preprocesssing-data-from-a-file $ 3' – Willow

+1

jabber通過jsfiddle連接到您發佈的示例JSON。而且我具有這種結構的方式在穿過電線到瀏覽器時沒有無用的空白來消耗帶寬。 – Orangepill

+0

非常感謝您的幫助。我已經爲此工作了三天,需要在今天晚上完成。 (> _ <;)我將你的代碼加載到php文件中。我將如何使用readfile()來確保json tmp文件已正確創建? – Willow

相關問題