A mere hateblo

単なるはてブロです。

ODSファイル内のシートのデータが大きくなりすぎた時の対処方法

仕事のデータを作成するのにLibreOffice Calcを利用しています。具体的には数値や文字列などCalcで入力してODSファイルとして保存、ODSファイルの内容をRubyから読み取ってバイナリファイルやC言語のヘッダファイルを作成しています。普段はとくに問題ありませんが、稀にODSファイルに保存したシートのデータが馬鹿でかくなるせいでRubyからデータを読み取る際にえらく時間がかかることがあります。で、問題は解決していませんが、それなりな対処方法がわかったのでココにメモしておきます。

以前ODSファイルに含まれるcontent.xmlの内容を調べたところ、問題発生時にはなぜか1行に含まれるセルの数が実際のデータよりもはるかに多い状態になり、それが全行数で起きているようでした。そのため、延々と空のセルを読むという無駄な処理ばかりしていました。一番大きなシートはだいたい8000行x15列くらいのもので、Ruby 1.9.3-p125とnokogiriを使ってだいたい50秒弱で処理できる規模のものですが、問題が起きると数倍から数十倍時間がかかるようになります。もうこうなると仕事になりません。

問題が発生するキッカケがわからないため、バックアップ目的でODSファイルをこまめにSubversionリポジトリへcommitし、問題が起きたらrevertするという対処を続けてきました。これはこれで問題には対処できますが、それまで入力したものとかが無駄になりがちでした。しかしとうとう、現状は問題なくとも、少しでもセルの内容を変更してODSファイルへ保存するだけで上記問題が発生するようになってしまいました。

今日になってさらに調べたところ、この問題はシート単位で起こることがわかりました。そこでシートを新規作成し、問題のシートの内容を必要なところだけ新規シートへ移し、問題のシートを削除する、という対処をとったところ、上記問題を解消できました。ただし、問題のあるシートを対処したところ別の問題のなかったシートに問題が発生することがありましたので、結局すべてのシートで問題が起きなくなるまで対処を続けました。全10シートのうち3シート対処しましたが、シート数が少ないからいいものを、シート数が多くなると頭抱えそうです。

問題の再現方法がわかればLibreOffice(OpenOfficeも多分同様)へ報告したいところですが、突然起きるのでなんともできないのが歯がゆいです。同じような問題を抱えている人もググった限りでは見つかりませんでしたし、Calc上で編集する分にはなんら問題のないことなので、余計に報告しづらいというか、なんというか。