PHPExcel и большие файлы

Появилась задача распарсить и добавить в базу данных прайс-лист в формате Excel. Задача в общем виде простая — для этого есть PHPExcel. Проблемы как обычно возникают в отдельно взятых случаях. В данном случае проблема оказалась в большом размере файла xls — примерно 11 Мб.

Есть следующий код:

$inputFileType = PHPExcel_IOFactory::identify($file);
$objReader = $objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($file);

Для файла он потребляет в пике около 270 Мб оперативной памяти, что не очень приемлимо для виртуального хостинга. В результате на хостинге скрипт не работает — возникает ошибка «Out of memory»

Так как файл нужен только для чтения, то добавим опцию

$objReader->setReadDataOnly(true);

Потребление оперативной памяти при этом снизилось до 197 Мб. Уже неплохой результат. Для его улучшения добавим кеширование данных файла.

PHPExcel_Settings::setCacheStorageMethod(PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip);

Это снизило быстродействие скрипта, но в данном случае это не критично. Главное вписатья в рамки потребления памяти.

В библиотеке PHPExcel есть несколько вариантов кеширования. Данный вариант был выбран опытным путем — как компромисс между требованиям к памяти и возможностями хостинга.

В результате код стал следующим.

PHPExcel_Settings::setCacheStorageMethod(PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip);
$inputFileType = PHPExcel_IOFactory::identify($file);
$objReader = $objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($file);

А памяти, для того же самого файла, он стал потреблять 131 Мб., т.е. в два раза меньше чем первоначальный.

Очень неплохой результат, как мне кажется.

Запись опубликована в рубрике Работа с метками , . Добавьте в закладки постоянную ссылку.

Добавить комментарий