1024MB の RAM が割り当てられているにもかかわらず、PHPExcel は 3MB XSLX ファイルをロードするときにメモリ不足に陥ります。根本的な原因は、大規模なスプレッドシートの表示に伴うメモリを大量に使用するプロセスにあります。
この問題に対処するには、次のようないくつかの最適化手法を使用できます。
特定のワークシートのみをロードする必要がある場合は、setLoadSheetsOnly() を使用して、リーダーによって読み取られるシートの数を制限します。
$objReader->setLoadSheetsOnly([ 'Data Sheet #1', 'Data Sheet #3' ]);
特定のセルまたは行のみを取得するには、読み取りフィルターを使用できます。
class MyReadFilter implements PHPExcel_Reader_IReadFilter { // ... implementation } $objReader->setReadFilter(new MyReadFilter());
大きなスプレッドシートをチャンクで読み取ると、データの一部を読み込むだけでメモリ フットプリントを最小限に抑えることができます。
$chunkSize = 20; $chunkFilter = new chunkReadFilter(); for ($startRow = 2; $startRow < 65536; $startRow += $chunkSize) { $chunkFilter->setRows($startRow, $chunkSize); $objPHPExcel = $objReader->load($inputFileName); }
readDataOnly を true に設定すると、データをフォーマットせずにセル値のみが読み込まれ、メモリ使用量が削減されます。
$objReader->setReadDataOnly(true);
セル キャッシュはセル オブジェクトを圧縮形式で保存し、メモリ消費量を大幅に削減しますが、速度は犠牲になります。
イテレータを使用して手動で配列を構築する代わりに、PHPExcel の toArray の使用を検討してください。 () または rangeToArray() メソッドで配列を効率的に生成します。
以上が大きな XLSX ファイルをロードするときにメモリの枯渇を防ぐために PHPExcel を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。