その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

Excel::Writer::XLSXのset_optimization()について

基本的にExcel::Writer::XLSX使うときは

my $workbook = Excel::Writer::XLSX->new('yabai.xlsx');
my $worksheet = $workbook->add_worksheet();
...

みたいな感じで使うと思うんですが,素朴にこれでやっていこうとするとExcelの行数が増えた時にメモリをバカ食いしてしまって,最悪の場合死に至ります.実際さっき死んだ.

そこでどうするかというと,set_optimization()というメソッドadd_worksheet()する前に呼んでやると良いです.

my $workbook = Excel::Writer::XLSX->new('yabai.xlsx');
$workbook->set_optimization();
my $worksheet = $workbook->add_worksheet();
...

PODにも

The "set_optimization()" method is used to turn on optimizations in the
Excel::Writer::XLSX module. Currently there is only one optimization
available and that is to reduce memory usage.

とあるように,現在のところ使用メモリ量を削減するための手立てはこれしか無いので使うほかないです.

トレードオフとしては,「既にセルに書き込まれているデータについて操作するいくつかの処理が動かない」というのがあって,これはぶっちゃけテーブル関係の処理が動かなくなるという意味なんですが,実際のところPerl経由でテーブル関係の処理とか滅多に使わないし,万が一使う事になってもそれはその時になってから考えればよろしいので,とりあえず何も考えずにset_optimization()を呼んでおけば良いという認識です.行数が多い時は速度も速くなるようですし

とにかく重要なのは,ドキュメントにあるようにadd_worksheet()する前にset_optimization()しなければならないということです.逆だと最適化が働かないので.