2012-03-15 64 views
3

我正在使用PHPExcel框架嘗試從mysql查詢中寫出非常大的ex​​cel文檔。PHPExcel - 寫入/追加塊

一切工作正常,直到我打了5000行的標記(或有大約的)所在頁面的時候,出現錯誤標記:

Fatal error: Allowed memory size of xxx bytes exhausted (tried to allocate yyy bytes) in zzz on line aaa 

我知道這是記錄在案,我已經調整的內存分配服務器,但即使如此,我仍然觸及天花板。我也嘗試關閉格式化,但實際上我會需要它。

那麼有沒有辦法以小塊寫入,或追加到Excel文件,所以我沒有耗盡內存分配?我正在考慮沿着頁面的行寫1000行,然後重定向到自己並使用GET處理下一個1000以保持跟蹤。例如:

index.php?p=0

然後重定向到

index.php?p=1000

但我不能找到一種方法來添加到現有的文檔,而無需打開了整個事情。

回答

3

儘管一個常見的錯誤是人們將他們的mysql數據加載到一個數組,然後循環訪問設置Excel單元格數據的數組,但是沒有辦法用塊來編寫代碼。在循環訪問mySQL查詢結果集時,設置單元數據的內存效率更高。

如果您需要將內存使用量降到最低,您使用的是哪種單元緩存方法?單元緩存較慢,但可以節省大量的內存。

+0

Cache!我甚至沒有確定,好的電話。快速跟進問題,對於有大量寫入的大文檔,您會選擇哪種緩存方法?我剛剛嘗試過'cache_to_discISAM',它可以處理大約6列的10,000行,但是在60,000處出錯。不要誤解我的錯誤10,000是真棒,並且會很充足 - 但我喜歡強調測試我的應用程序。編輯 - 我不在乎速度在這種情況下 – Chris 2012-03-16 03:34:39

+0

編輯2 - 我在apache/linux服務器上運行(所以贏得緩存已經結束) – Chris 2012-03-16 03:45:45

+0

所有當前的產品發佈緩存方法至少保留一個單元映射「在內存中「,所以(比如)DiskISAM和phpTemp一樣在文件」內存「中保存單元格引用的大小和位置。生產代碼中最具內存效率的緩存機制是memcache,APC和WinCache,其中map僅僅是一個簡單的「cell exists」布爾值。最新的SVN代碼(在預發佈測試中)增加了SQLite作爲緩存選項,它更加高效地存儲內存(根本沒有「內存」映射,一切都在SQLite內部) – 2012-03-16 07:29:52