Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHPExcel / 4 сообщений из 4, страница 1 из 1
20.11.2014, 19:55
    #38812424
WebDebug
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHPExcel
Здравствуйте.

Пробую в PHPExcel загружать файл (не самый большой, 22Мб) Excel "по частям" с помощью фильтра. В результате - ничего хорошего. То, ради чего это делается, не достигнуто: память переполняется. Хотя, при этом в файле не доступны "ненужные" ячейки, т.е. фильтр как будто работает, загрузка идет быстрее, но почему тогда память переполняется? Ведь фильтр для этого и сделан, чтобы читать только то, что нам нужно (а здесь я задаю для чтения всего-то две строки). При этом на просторах сети многие радуются, что все работает даже при memory_limit 128M.

Код функции чтения:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function LoadMyFile() {
	require_once $_SERVER['DOCUMENT_ROOT'].'/phpexcel/PHPExcel.php';
	$Time1 = GetmicrotimeX();
	$FileName = '/price_22MB.xls';
	$objReader = PHPExcel_IOFactory::createReaderForFile($_SERVER['DOCUMENT_ROOT'].$FileName);
	$objReader->setReadDataOnly(true);
	$chunkFilter = new chunkReadFilter();
	$objReader->setReadFilter($chunkFilter);
	$objPHPExcel = $objReader->load($_SERVER['DOCUMENT_ROOT'].$FileName);
	print 'Value: '.$objPHPExcel->getActiveSheet()->getCell('C3000')->getValue().'<br/>';
	unset($objPHPExcel);
	$Time2 = GetmicrotimeX();
	print 'Time: '.round($Time2-$Time1,2);
}



Класс для фильтра:
Код: php
1.
2.
3.
4.
5.
class chunkReadFilter implements PHPExcel_Reader_IReadFilter {
	public function readCell($column, $row, $worksheetName = '') { 
		return ($row>=1 && $row<=2 && $column=='A');
	} 
}
...
Рейтинг: 0 / 0
20.11.2014, 22:53
    #38812544
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHPExcel
А что, файл не должен загрузиться в память целиком или, как минимум, до "нужных" ячеек?
...
Рейтинг: 0 / 0
20.11.2014, 23:33
    #38812570
WebDebug
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHPExcel
Везде глаголят (и вроде даже на самом сайте PHPExcel), что этот механизм позволяет загружать 100-мегабайтные Excel-файлы на серверах с памятью 128Мб.. Что уж говорить про мой файл в два десятка мегабайт и memory_limit = 1500M..
...
Рейтинг: 0 / 0
21.11.2014, 00:10
    #38812580
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHPExcel
WebDebugВезде глаголят (и вроде даже на самом сайте PHPExcel), что этот механизм позволяет загружать 100-мегабайтные Excel-файлы на серверах с памятью 128Мб.Можете дать ссылку на этот момент в официальной документации? Тоже сталкивался с большим расходом памяти, но как-то глубоко не копал в плане оптимизации - была возможность поднять мемори лимит, на том и забросил. Насколько понимаю, "екселевские" файлы бывают двух основных видов - бинарный закрытый формат xls и XML-формат xlsx. Последний, в принципе, без особых проблем поддается потоковой обработке, что позволяет читать его кусками и освобождать память по мере прочтения фрагмента. Насчет подобной обработки файла бинарного формата имею сомнения.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHPExcel / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]