2010-08-21 103 views
14

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1078799 bytes) in D:\xampplite\htdocs\Scraper\PHPExcel\Reader\Excel2007.php on line 269如何解決內存越來越疲乏PHPExcel?

我的128M PHP內存限制很快就會耗盡,即使我只是想用PHPExcel打開一個小小的〜350 KB的excel文件。

雖然,我可以增加配置中的內存限制,但很高興看到是否有任何替代方案來解決這個問題。

+4

找出在Excel中使用這麼多的內存,然後修復它..... – SoapBox 2010-08-21 12:27:24

+1

@SoapBox:總之,PHPExcel - 它是一個真正的內存豬:(而且,它是一種複雜的庫,所以發現(更不用說修復)一個錯誤是非常重要的,在最壞的情況下,迴避這個問題並找到一些替代庫可能會更容易 – Piskvor 2010-08-21 15:01:37

+2

成爲微軟認證的,它只需要知道如何重啓機器。將釋放被泄漏軟件使用的內存 – 2010-08-21 16:46:15

回答

50

文件大小不在使用PHPExcel時對於工作簿文件來說是一個很好的方法。行數和列數(即單元格)更重要。

PHPExcel代碼本身的佔用空間爲10到25MB,具體取決於正在訪問的組件。

目前,工作簿中的每個單元平均需要1k的內存(沒有任何緩存)或1.6k的64位PHP--我暫時假設32位PHP--因此(例如)a 8000行31列(248,000個單元)的工作表大約242MB。使用單元格緩存(例如php:// temp或DiskISAM)可以減少約三分之一,因此8000行×31列將需要大約80MB。

有許多可用來幫助您減少內存使用選項:

是否使用電池緩存與PHPExcel?

require_once './Classes/PHPExcel.php'; 

$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp; 
$cacheSettings = array(' memoryCacheSize ' => '8MB'); 
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); 

$objReader = PHPExcel_IOFactory::createReader('Excel2007'); 
$objPHPExcel = $objReader->load("test.xlsx"); 

如果你只需要訪問您的工作表數據,並且不需要訪問單元格格式,則可以禁用閱讀從工作簿中的格式信息:

$objReader = PHPExcel_IOFactory::createReader('Excel2007'); 
$objReader->setReadDataOnly(true); 
$objPHPExcel = $objReader->load("test.xlsx"); 

如果您只需要訪問一些,但不是所有工作簿中的工作表,您可以加載只有那些工作表:

$objReader = PHPExcel_IOFactory::createReader('Excel2007'); 
$objReader->setLoadSheetsOnly(array("Worksheet1", "Worksheet2")); 
$objPHPExcel = $objReader->load("test.xlsx"); 

,如果你只想工作表中讀取某些細胞,你ç添加一個過濾器:

class MyReadFilter implements PHPExcel_Reader_IReadFilter 
{ 
    public function readCell($column, $row, $worksheetName = '') { 
     // Read title row and rows 20 - 30 
     if ($row == 1 || ($row >= 20 && $row <= 30)) { 
      return true; 
     } 

     return false; 
    } 
} 

$objReader = PHPExcel_IOFactory::createReader('Excel2007'); 
$objReader->setReadFilter(new MyReadFilter()); 
$objPHPExcel = $objReader->load("test.xlsx"); 

所有這些技術都可以顯着減少內存需求。

+0

5年後:您的答案仍然是最新的? – robsch 2015-12-10 09:04:08

+0

@robsch - Excel文件在5年內未改變格式; PHP內存限制仍然是PHP內存限制5年; cell PHPExcel中仍然存在緩存和讀取過濾器 – 2015-12-10 09:06:29

+0

很高興知道。謝謝! – robsch 2015-12-10 09:13:12

1

如果你想知道,你可以使用xhprof。根據這個鏈接,你可以跟蹤它的內存使用情況...

3

僅僅因爲數據文件只有X字節,並不意味着它使用RAM的X字節。例如,$ _SESSION數組中的4K數據在加載時使用64K的ram。這取決於代碼對這些數據所做的事情。正確的答案是增加公羊的數量。

此外,如果這是一個XLSX文件,它們是ZIP的XML文檔。文本文件壓縮比1/2更嚴格,因此您的350K XLSX文件很容易爲1MB Excel文件。

+0

這是一個非常好的答案,我從中學到了。謝謝。 – Chris 2010-08-21 23:36:46

1

Xdebug是用於php的分析器/調試器,可以幫助您追蹤內存使用情況和功能調用,找出問題所在。而且易於安裝,大多數Linux發行版都將其存放在存儲庫中,「yum install xdebug」,「apt-get install xdebug」。

2

PHPExcel以內存泄漏而聞名。我建議你使用的需要是PHPExcel使用內存的一小部分如下:

1)閱讀:PHP-Excel-Reader

2)寫作:Pear Spreadsheet Excel Writer

+0

根據網站的鏈接「Spreadsheet_Excel_Writer is out過時並需要徹底重寫。如果您想幫助完成這項任務,請與我們聯繫。 「 – Isius 2011-12-02 19:32:13

+0

PHP-Excel-Reader也適用於Excel 2007? – logan 2014-02-22 17:07:32

+0

寫作:[PHP_XLSXWriter](https://github.com/mk-j/PHP_XLSXWriter)內存使用情況比PHPExcel低95% – velcrow 2014-04-16 20:44:43

1

你應該注意的一件事是空單元格。

我有同樣的問題,只有800行數據和腳本甚至無法閱讀。 無論是超時和內存不足錯誤,當任何一個被修復。

@Mark Ba​​ker對細胞的評論讓我想到了。我注意到我有大量的空單元格,只把數據單元格複製到一個新的工作簿中,讓它在一秒鐘內運行。

希望這可以幫助別人。

0
$objReader = PHPExcel_IOFactory::createReader('Excel2007'); 
$objReader->setReadDataOnly(true); 
$objPHPExcel = $objReader->load("test.xlsx"); 

這多少代碼是關於如何關閉PHPExcel讀者足夠

0

這篇文章會談: How to close excel file in php-excel-reader 如果你同時打開多個Excel文件,但實際上並不需要他們都在同一時間,那麼你可以嘗試打開和關閉(即取消設置)每個文件的讀者一個接一個。順便說一句,讀者使用相同的變量名就足夠了「unsetting」操作。