2013-08-06 33 views
1

另一個問題,我說我正在運行一個php腳本,它從mysql數據庫中抓取150行數據,然後對該數據進行了一些計算,並將其放入一個數組中(120個元素,每個元素的數組爲30 ,或總共大約3600個元素)。 「結果」數組是需要的,因爲我用數據創建了一個圖。這個腳本工作正常。處理超大型數組的最佳做法? D B?

我想將我的腳本擴展爲更密集的數據集(這將提供更好的結果)。數據集是1700行,最終將以1340個元素的「結果」數組爲單位,每個數組爲360個元素,總計約爲482400個元素。問題是,我試過這個,並且發現了一些令人髮指的內存錯誤。

正如在前面的問題我貼給我描述的該尺寸導致陣列可能是急劇的服務器內存

在你第二個更大的樣本將是陣列(1700,1699)。每個元素144個字節,即415,915,200個字節,略大於406Meg +剩餘的存儲空間,僅用於保存計算結果。

我不熟悉處理此問題的典型方法。我正在考慮更大的數據集,序列化和base64_encode'1340每個結果數組元素,它運行(或每10或20 1340分貝調用可能太多),並上傳到SQL服務器,並且取消設置結果數組以釋放內存。然後,我可以通過向數據庫查詢特定信息來製作我的報告和圖表,而不是將它全部放在一個龐大的數組中。

還有其他的方法嗎?

回答

0

在處理大量數據時,您應該使用Hadoop map-reduce和/或其他此類技術。並且您想對數據執行的大多數處理都必須是批處理。結果必須放在別的地方 - 另一個數據庫。您只需要查詢該數據庫,並且您的應用程序將變得更快,並且不會遇到內存問題。

0

最簡單和最快的方法可能是繼續使用您的內存陣列解決方案,並找出如何解決內存問題。你遇到的內存錯誤是什麼?

如果您有超過1GB的RAM,應該足以生成您的圖形。使用1GB內存,您可以將memory_limit PHP配置選項設置爲750MB。您只能一次生成一個進程,因此您需要生成它並使用某種方法來緩存結果。

如果您沒有足夠的RAM在您當前的系統上。我建議嘗試使用亞馬遜EC2,您可以在現貨市場上以每小時7美分的價格購買16GB的機器,只要您需要生成圖表,就可以停止並開始使用。

0

你可以提供關於你的用例的更多細節嗎?你需要服務多少個不同的圖表?基礎數據多久變化一次?您需要爲多少個併發用戶提供服務?你是否真的試圖在單個圖表上繪製200萬個元素?

在沒有具體的,我想指出/推薦以下一些組合:

  1. 離線創建您的圖表和緩存它們
  2. 使用基於Web的解決方案,以卸載所有的查詢和圖表生成(谷歌圖表+谷歌融合表)
  3. 使用後端進程來執行分析並生成圖表,只將最終結果暴露給客戶端。檢出R和http://www.rstudio.com/shiny/
+0

如上所述,較小的用例(150個週期)繪製3300個點。較大的一個*會是400k點。我當然考慮過後端流程路線。我使用dygraphs作圖。 –