2025-12-29

openpyxl で 保存が重い、出来上がったファイルが大きすぎると感じたとき

実際の失敗談からの展開になります

openpyxl で作ったエクセルファイルがやけに大きい


あれれ、何かおかしいぞ?
前々から ii-win-merge は少し重たくて、ii-diff は軽い!!

そんな印象を持っていたんですが
100 を超えるファイルを比較したときに、顕著にその差が見て取れて

ついに「おかしい!」と確信する事態となりました!!


重たい!という症状は

PC 全体の動きがもっさりしだすし
タスクマネージャを見ると メモリはフルに・・・

HDD も 14GB くらいの余裕があったのに
数百MB まで落ちている

そして、最終的にエラーで結果の出力ができない!ときた・・・



絶対、どこかでメモリリークのような開放漏れがあるんだろうと思いました

そこからは いろいろと トライ&エラー です orz
1回のトライ(ここを変えたらどうなる?ってお試し)に 3~5H かかりました

なんせ
100 を超えるファイルを比較して、処理が終わるころにエラーするもんだから


いちいち時間がかかる
そして、その間、PC が重くなるから、何もできなくなります

難航しました・・・


原因がわかったのは
ファイル数を 50個くらいに抑えて出力した結果を ii-diff の結果と比較しているときでした


差分表の最後の行から Ctrl+下 でジャンプするファイルの最終行の位置が違う!!


そこに気づき着目しました!

ii-diff は 1,048,576行 (← 最新のエクセルで扱える最大行数)
ii-win-merge は 65,535行





行数が少ない ii-win-merge の方がファイルが大きくなるのはなぜ?と思う人もいるかもしれないですが・・・



ii-diff は値の入っている有効行が 差分表の最後の行(116行目)なのでエクセルの最終行に飛び
ii-win-merge は エクセルの最終行に飛ばないので、
差分表の後にも値の入っている行があって、その値の入っている最後の有効行に飛んだのだろう

そう解釈をしました (;^ω^)

よく見ると



実際
上図のようにグレー塗のセルが 65,535行まで続いていました


絶対これやん!!


そこを修正したら、さっくり軽くなり、約 7分 で結果出力できるようになりました ('ω')ノシ



シート当たりのデータ量が無駄に多かったんだもん
そら重いわな・・・


結論

openpyxl は ワークブックの save() で時間がかかります
保持していたデータを xml にして、エクセルのファイル構成を作って
zip に圧縮するらしいです

データ量に比例して時間が増えますので、
小さなデータを扱っているつもりなのに、とても時間がかかるときは

私のように
意図せず広い範囲のセルを使っていないか、ご確認くださいませ 🙇‍♂️🙇‍♂️🙇‍♂️







0 件のコメント:

コメントを投稿

ご訪問をありがとうございます ✨✨✨

八百茄子 は ソフトウェアエンジニア1名による小さな工房です 週末に スキルアップ と 八百茄子 向けのコンテンツ作成に勤しんでおります ご提供コンテンツ tools  にて 八百茄子 の作成したツールをご紹介しています knowhow  にて、 2x年の組込み系ソフトウェア開発...