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

Popular posts from this blog

shopping cart - Page redirect not working PHP -

php - How to modify a menu to show sub-menus -

python - Installing PyDev in eclipse is failed -