mysqlにインポートするために約20MBの大きなExcelファイルを読み込もうとしています。
私はインターネット全体を検索し、「チャンクの読み取り」ソリューションを見つけましたが、機能していません...または私にとってはとても遅いです.理由はわかりません.
これは私がしていることです:
// .....
// 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! ";
}
ただし、 for 内では、 $objReader->load() に 40 秒ほどかかっており、実際には 2 回ループした後にメモリ エラーが発生しました。
for 内で $objReader の設定を解除すると、for 内で約 20 回実行できます... (10 分ほどかかりますが) メモリ エラーが発生します。
フィルターを使用している場合、ロード関数がすべてのファイルを読み取るように見えるのはなぜでしょうか。また、フィルター戦略はすべての行を解析し、必要でないすべての行に対して false を返すようです...読み取りを中止することはできません。本当に必要なものだけを読んでいますか?
FilterClass とコード スニペットをいくつか試しましたが、同じ結果が得られました...