2012-12-22 24 views
7

我有一個oracle數據庫,其中存儲大量的生物測定數據,如HRV和ECG。我需要在Excel表格中爲每個用戶顯示這些數據。但是這個數據非常大,即使對於一個用戶,我們也會獲得超過100,000條記錄。目前有100〜用戶。使用php寫入大量的數據到Excel沒有內存限制錯誤

什麼我做的是:

  1. 我使用相同的命令行,這是我在Zend框架開發的執行cron作業。
  2. 我確保這個CRON不重疊。
  3. 我從oracle數據庫中爲每個用戶逐個獲取所有數據,然後將其存儲在一個數組中。
  4. 當我得到所有用戶的數據時,我使用phpexcel庫生成Excel表。數據| |數據Excel表單

    • UID 1/UID/2 UID/3 -----------第n
    • 數據的

      結構|

    • 數據|數據|數據|
    • |
    • 第n

問題:

PHP需要的RAM 1.5 GB和在陣列存儲該數據,並將其發送到功能用於與phpexcel相互作用但這個庫需要3-4小時然後我得到「致命:內存限制」錯誤。我的系統只有2 GB RAM。

我應該採取哪些步驟來優化我的代碼以處理這種大小的數據並以excel格式顯示相同的信息,或者我需要增加RAM?

+0

您的用戶將如何處理Excel中的大量數據? –

+0

這些用戶基本上都是研究人員。所以他們可能會在matlab中使用這些數據,或者可能會用它來創建更好的算法。有這麼多的可能性。基本上我的問題都是尋找優化的方式來處理這種情況。 – techgyani

回答

7

考慮只使用PHP來啓動某種包含結果數據的Excel可讀分隔文件(CSV)。 (這個想法是,你不會通過PHP寫入Excel - 因爲你遇到了限制)。

您可以通過類似Powershell的方式請求php生成的文件,然後讓Powershell或其他腳本選擇將csv文件直接打開到Excel中,然後另存爲xlsx。

或者你可以讓你的命令行php做一個'系統'調用,並執行腳本步驟,直接打開csv到Excel,然後將其保存爲xlsx。

+0

你是對的,以CSV格式存儲這些數據會好很多。但是假設這個文件的大小在php寫入時變爲1GB。那麼需要多少內存,我的意思是它不會導致內存錯誤?當我們在記事本軟件中打開1 GB文件時,我們發現它被吊起來了,PHP是否已經過優化? – techgyani

+1

PHP不需要同時寫入文件的內存中的所有數據。對於所有100個用戶,您可以讓Oracle查詢一次返回1000行數據,而不僅僅是一個用戶。一次寫入1000行到文件。然後通過Oracle獲得接下來的1000行。追加接下來的1000行等(您可以試驗在速度與內存消耗方面效果最好的行數)。 – DWright

+0

不錯的建議,但我忘記提到的一件事是,我需要在excel文件中使用多個工作表,如單張表中的所有用戶的HRV數據和另一個工作表中的呼吸速率,我在這裏有Linux服務器。因此,將CSV轉換爲XLS將會起作用,或者我需要對XLS文件採用相同的方法。 – techgyani

1

如果單個用戶數據量很大,您使用的內存太多以保留此數據,請嘗試以批處理模式將其寫入excel。它會節省您的內存使用量。