php - PHPExcel - memory leak when I go through all rows -
i'm using phpexcel library reading xls , xlsx files. below sample function demonstrating problem have:
public function memoryaction() { $filename = "example.xlsx"; echo "<br>script started<br>"; echo memory_get_usage(true); $inputfiletype = phpexcel_iofactory::identify($filename); $objreader = phpexcel_iofactory::createreader($inputfiletype); $objreader->setreaddataonly(true); $objreader->setloadsheetsonly(array('otms','printing')); $excelreader = $objreader->load($filename); echo "<br>reader initiliazed<br>"; echo memory_get_usage(true); foreach ($excelreader->setactivesheetindex(0)->getrowiterator() $row) { if ($row->getrowindex() == 1) { continue; } $celliterator = $row->getcelliterator(); $celliterator->setiterateonlyexistingcells(false); $excelrow = array(); foreach ($celliterator $cell) { $columnindex = $cell->getcolumn(); $cellvalue = $cell->getcalculatedvalue(); $excelrow[$columnindex] = $cellvalue; } if (empty($excelrow)) { continue; } echo "<br>row ".$row->getrowindex()."<br>"; echo memory_get_usage(true); } echo "<br>went through each row<br>"; echo memory_get_usage(true); die(); } so, go through each row in excel table , output memory usage. thing memory usage increases after each 20-30 rows.
here values get:
script started 1835008 -1,75 mb
reader initiliazed 19660800 - 18,75 mb
went through each row 47972352 - 45,75 mb
i read several posts on internet phpexcel memory problem. yes, consumes lot of memory. can see, use setreaddataonly() function , uploaded specific worksheets. still don't understand why looping through rows consumes memory.
is there way unset row/cell objects in loop , free memory? appreciate help.
upd
i have run mark's code , here result file:
base memory: 1835008 reader initialised/file loaded 19660800 row 256 memory usage: 24903680 row 512 memory usage: 33030144 row 768 memory usage: 38797312 went through each row final memory usage: 48234496 i'm using phpexcel version 1.7.8. , php 5.5.11. it's worth update phpexcel library.
upd 2
i have installed version 1.8.0 of phpexcel library. here results of mark's code:
base memory: 1835008 reader initialised/file loaded 15990784 row 256 memory usage: 20185088 row 512 memory usage: 27262976 row 768 memory usage: 31719424 went through each row final memory usage: 40108032 any ideas why happens? i'm using zend framework , called code in action controller. test file contains 4 tabs, file size - 619 kb. code works first tab contains 1000 rows.
i've created single worksheet file 8192 rows , 32 columns test. script i'm running read based on script you've posted above:
echo "base memory: ", memory_get_usage(true), php_eol; $inputfiletype = phpexcel_iofactory::identify('volumetest.xlsx'); $objreader = phpexcel_iofactory::createreader($inputfiletype); $objreader->setreaddataonly(true); $excelreader = $objreader->load('volumetest.xlsx'); echo "reader initialised/file loaded", php_eol; echo memory_get_usage(true), php_eol; foreach ($excelreader->setactivesheetindex(0)->getrowiterator() $row) { $celliterator = $row->getcelliterator(); $celliterator->setiterateonlyexistingcells(false); foreach ($celliterator $cell) { $columnindex = $cell->getcolumn(); $cellvalue = $cell->getcalculatedvalue(); } if (($row->getrowindex() % 256) == 0) { echo "row ".$row->getrowindex(), ' memory usage: ', memory_get_usage(true), php_eol; } } echo "went through each row", php_eol; echo "final memory usage: ", memory_get_usage(true), php_eol; so i'm iterating through rows , columns in same way are, , real differences i'm displaying memory usage every 256 rows of iteration rather every row, , i'm not building array of cell values.
the output generates is:
base memory: 524288 reader initialised/file loaded 105119744 row 256 memory usage: 105119744 row 512 memory usage: 105119744 row 768 memory usage: 105119744 row 1024 memory usage: 105119744 row 1280 memory usage: 105119744 row 1536 memory usage: 105119744 row 1792 memory usage: 105119744 row 2048 memory usage: 105119744 row 2304 memory usage: 105119744 row 2560 memory usage: 105119744 row 2816 memory usage: 105119744 row 3072 memory usage: 105119744 row 3328 memory usage: 105119744 row 3584 memory usage: 105119744 row 3840 memory usage: 105119744 row 4096 memory usage: 105119744 row 4352 memory usage: 105119744 row 4608 memory usage: 105119744 row 4864 memory usage: 105119744 row 5120 memory usage: 105119744 row 5376 memory usage: 105119744 row 5632 memory usage: 105119744 row 5888 memory usage: 105119744 row 6144 memory usage: 105119744 row 6400 memory usage: 105119744 row 6656 memory usage: 105119744 row 6912 memory usage: 105119744 row 7168 memory usage: 105119744 row 7424 memory usage: 105119744 row 7680 memory usage: 105119744 row 7936 memory usage: 105119744 row 8192 memory usage: 105119744 went through each row final memory usage: 105119744
showing no memory usage changes @ point during row iterations
i've run these tests using phpexcel versions 1.7.9, 1.8.0 , latest development branch against php versions 5.2.17, 5.3.27, 5.4.7, 5.4.21, 5.5.5 , 5.6.0 , have seen no variation of memory usage within iterators combination of phpexcel/php.
Comments
Post a Comment