記憶を頼りに。
帳票出力で1万行を超えるExcelをPHPSpreadSheet
で書こうとした。
プロジェクトにはすでにPHPSpreadSheet
のヘルパーライブラリがあってそれ使えみたいな空気感。
で、パフォーマンスが悪くて死んだ。
2000行超えたあたりから1行書くのに3秒とかかかる様になって詰んでた。
パフォーマンス問題
問題は記憶が確かならこの関数
$spreadsheet->getActiveSheet()->insertNewRowBefore(7, 2);
insertNewRowBefore
。この関数、前の行の様式や書式を引き継いでしてくれるので楽なんですけどパフォーマンスで死ぬ。
PHPSpreadSheet
、全体的にパフォーマンス問題抱えているようでGithubとかも死屍累々、Stackoverflowでは別のライブラリ使えって言われるので全体的に負け戦。でもなんとかしなきゃいけない
対応方法
ともかくからのExcelに行番号を保持してインクリメントしながら書き倒して、様式書式全部設定していけば速度もメモリも許容範囲に収まった。
楽な道はパフォーマンスが悪い、という典型でした。
ダメだった対応
- 適当な大きさのExcelを用意してそこに書く
5万行とかのExcelテンプレート用意したらメモリ使用量が1GBとかいってダメだった。
結果
所要時間
360分(予測)→ 12分
まぁまぁ、劇的な結果。
1時間たっても1/6しか進んでなくてプロセス殺したので死んでたときの経過時間は予測。
実際はどんどん一行書くのに時間がかかっていくようになっていたので360分では終わらなかったと思う。
以上です。