ich mit PHPExcel, um .xls-Dateien zu lesen. Ich eine ganz kurze Zeit iLesen .xls-Datei über PHPExcel wirft Fataler Fehler: zulässige Speichergröße ... sogar mit Chunk-Reader
Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 730624 bytes) in Excel\PHPExcel\Shared\OLERead.php on line 93
nach einigen googeln treffen, i chunkReader versucht, dies (auch auf PHPExcel Homesite erwähnt) zu verhindern, aber im noch mit diesem Fehler stucked.
Mein Gedanke ist, dass via Chunk-Reader, ich werde Datei für Teil lesen und mein Speicher wird nicht überlaufen. Aber es muss ein ernstes Erinnerungsdefizit geben? Oder befreie ich etwas Speicher? Ich habe sogar versucht, Server-RAM auf 1 GB zu erhöhen. Dateigröße, die ich versuche zu lesen ist etwa 700k, die nicht so viel ist (ich lese auch ~ 20MB pdf, xlsx, docx, doc, etc Dateien ohne Problem). Also nehme ich an, dass es nur einen kleinen Troll geben kann, den ich übersehen habe.
Code wie folgt aussieht
function parseXLS($fileName){
require_once dirname(__FILE__) . './sphider_design/include/Excel/PHPExcel/IOFactory.php';
require_once dirname(__FILE__) . './sphider_design/include/Excel/PHPExcel/ChunkReadFilter.php';
$inputFileType = 'Excel5';
/** Create a new Reader of the type defined in $inputFileType **/
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
/** Define how many rows we want to read for each "chunk" **/
$chunkSize = 20;
/** Create a new Instance of our Read Filter **/
$chunkFilter = new chunkReadFilter();
/** Tell the Reader that we want to use the Read Filter that we've Instantiated **/
$objReader->setReadFilter($chunkFilter);
/** Loop to read our worksheet in "chunk size" blocks **/
/** $startRow is set to 2 initially because we always read the headings in row #1 **/
for ($startRow = 2; $startRow <= 65536; $startRow += $chunkSize) {
/** Tell the Read Filter, the limits on which rows we want to read this iteration **/
$chunkFilter->setRows($startRow,$chunkSize);
/** Load only the rows that match our filter from $inputFileName to a PHPExcel Object **/
$objPHPExcel = $objReader->load($fileName);
// Do some processing here
// Free up some of the memory
$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);
}
}
Und hier ist der Code für chunkReader
class chunkReadFilter implements PHPExcel_Reader_IReadFilter
{
private $_startRow = 0;
private $_endRow = 0;
/** Set the list of rows that we want to read */
public function setRows($startRow, $chunkSize) {
$this->_startRow = $startRow;
$this->_endRow = $startRow + $chunkSize;
}
public function readCell($column, $row, $worksheetName = '') {
// Only read the heading row, and the rows that are configured in $this->_startRow and $this->_endRow
if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
return true;
}
return false;
}
}
Ich habe diese Links vor einiger Zeit gefunden, aber sie haben mich nicht weiter bewegt dann Iam jetzt. Bei der Verwendung von Chunk Reader wird immer noch der selbe Fehler angezeigt, auch wenn getDataOnly auf True gesetzt ist ... –