我想读取一个大约20mb的excel文件导入到MySQL。phpExcel阅读大块如此缓慢和内存错误
我在互联网上搜索,发现“大块阅读”的解决方案,但不工作...或对我来说是如此缓慢,我不知道为什么。
这是即时通讯做什么:
// .....
// into MyReadFilter class.. this is the most important function:
public function readCell($column, $row, $worksheetName = '') {
// Only read the rows and columns that were configured
if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
if (in_array($column,$this->_columns)) {
return true;
}
}
return false;
}
// .....
$filter = new MyReadFilter(1, 22000);
$chunkSize = 10;
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setReadFilter($filter);
$objReader->setReadDataOnly(false); //not sure if this should be true
for ($startRow = 2; $startRow <= 65536; $startRow += $chunkSize) {
echo "Reading";
$filterSubset->setRows($startRow, $chunkSize);
$objPHPExcel = $objReader->load($inputFileName); // this line takes like 40 seconds... for 10 rows?
echo "chunk done! ";
}
但是,里面的,在$ objReader->负载()正在像40秒,而事实上,经过2个循环我有一个内存错误。
如果我没有设置$ objReader里面的内容,我可以使它在内部运行大约20次(尽管需要10分钟)和内存错误。
我想知道为什么加载函数似乎读取所有文件,如果即时通讯使用过滤器,也过滤器策略似乎解析所有行,并返回假的所有行是不需要的...是不可能的放弃阅读或真正阅读所需的内容?
我试过一对夫妇FilterClass和代码段,但得到了同样的结果...
好吧,花了数小时和数小时花在这个我决定做保存为CSV和导入几分钟内完成.. – 2013-04-08 16:00:46
感谢您解释这个标记,我不确定为什么过滤器的结构是他们的方式我认为“哇这是低效的,必须检查每个细胞”。你所说的话清楚说明它为什么是这样设计的。 – user984976 2015-04-25 01:10:11