4

PHP経由でインポートし、ファイル内の1つのシートだけをCSVに変換できるようにする必要があるExcelファイル(97-2003)があります。これらはユーザーによってアップロードされるため、手動で行うオプションはありません。PHP を使用する必要があります。

私は現在PHPExcelを使用しています.33,000行を超えるファイルを取得するまでは正常に機能していました...これにより、致命的なPHPエラーが発生しています:Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 97 bytes) in [pathtophpexcel]\PHPExcel\Worksheet.php on line 11231

これをさらに最適化する方法はありますか、それとも巨大なシートを扱うときに PHPExcel を使用するのは適切ではありませんか? 私が使用しているコードは非常に単純なので、さらに最適化できるかどうかはわかりませんが、指が交差しました! 私が使用しているコードは次のとおりです。

$reader = PHPExcel_IOFactory::createReader('Excel5');
$reader->setReadDataOnly(true);
$reader->setLoadSheetsOnly('Details');

$excel = $reader->load($filename);

$writer = PHPExcel_IOFactory::createWriter($excel, 'CSV');
$writer->save($filename_fixed);

PHPExcel が適切でない場合、何を使用するのが最適ですか?

編集 - これはマークの提案後の作業コードです

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array( 'memoryCacheSize' => '2GB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

$reader = PHPExcel_IOFactory::createReader('Excel5');
$reader->setReadDataOnly(true);
$reader->setLoadSheetsOnly('Details');

$excel = $reader->load($filename);

$writer = PHPExcel_IOFactory::createWriter($excel, 'CSV');
$writer->save($filename_fixed);
4

1 に答える 1

4

PHPExcel 1.7.3cell cachingは、PHP メモリの制限内で大きなワークブックを維持するためのメモリ使用量を削減するメカニズムとして導入されました。セル キャッシングは、セル データをシリアル化してサイズを小さくするか、セルのインデックスのみを「メモリ内」に保持してセル データを PHP メモリの外部に保持できるようにすることで、メモリ使用量を削減するというトレードオフを提供します。ただし、パフォーマンスは犠牲になります。

デフォルトでは、セル キャッシングはすべてのセルをメモリに保存し、最高の速度を実現します。ただし、その他のキャッシング オプションには次のものがあります。

  • メモリに圧縮
  • メモリにシリアル化された
  • メモリにシリアライズされた igbinary
  • ディスク上の赤
  • APC
  • memcache
  • ウィンキャッシュ
  • phptemp
  • sqlite または sqlite3 データベース

速度とメモリ使用量はそれらの間で異なり、オペレーティングプラットフォームやその他の設定によっても異なるため、自分の状況で使用するのに最適なオプションを見つける必要があります; ただし、一般的なガイドラインとして、メモリを効率的に使用するほど、パフォーマンスは低下します。SQLite オプションは最近追加されたもので、「セル インデックス」でさえメモリに保持されないため、最適なメモリ使用量を提供します。現在、sqlite の実行速度を改善できるかどうかを確認するためにいくつかの変更をテストしています。

使用方法は、開発者向けドキュメントのセクション 4.2.1 で説明されています

于 2013-03-21T13:34:09.633 に答える