我想讀取一個大約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