「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:3000
現在:1


セルへの読み書きはなぜ遅いのですか

ページOpenOffice.org FAQの登録ページ
投稿者mr_happy
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2011-05-01 15:39:06 (日)
OSWin7
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

一つ一つセルの読み書きをするとき、 エクセルに比べて非常に遅いようですが、この原因はどんなことで また、近い将来改善されるのでしょうか? 一括読み書きでもエクセルとの比較ではおそいようですが・・・

PS アップするときにちょっと間違えたみたいで、 「最近の20件」のところではタイトルが表示されませんでした。 どうしたら治るのかな?


マクロに関するご質問?

M.Kamataki (2011-05-02 21:28:46 (月))

今までの流れから想像するとマクロに関するご質問ですよね。とりあえず、過去にもちょっと早くなったケースがありました。faq/4/705「マクロの動作が極めて遅い」をご覧ください。これはグラフの描画の場合ですね。

上記faq/4/705では、OpenOffice.orgの不具合・要望データベースであるBugZillaに登録されているIssue(課題)が紹介されていますね。例えばsetDataArrayであれば、以下のIssueが登録されています。

setDataArray on large arrays completely locks OOo and windows
http://openoffice.org/bugzilla/show_bug.cgi?id=50263

読み書きが遅いのは事実です。このIssue #50263も原因の1つでしょう。修正を希望する場合は、Vote(投票)するのも良いと思います。方法は「当サイトの使い方/不具合・要望を出す」の「5.実装を待ちます。」をご覧ください。

根本的な問題ですか?

mr_happy (2011-05-03 08:59:07 (火))

失礼しました。マクロです。

また、私の言う意味はエクセルと比べ桁違い(?)に遅いのは、
例えば「言語の違い」とか「▽▽▽」の違いの事です。
そしてそれは根本的な問題なのか、
それとも若干の不具合とかの問題で多少時間をかければ大丈夫な問題なのかが知りたい点です。

もし根本的な事柄で速度が遅い場合は、大変深刻なことになります。
私も含め、エクセルからOOoに変更しようと思っている人たちは、再考せざるを得なくなるでしょう。

具体例

はにゃ? (2011-05-05 18:09:54 (木))

具体的なコードがないのであんまり調べられませんが、OOo Basic で書く場合と C++ で書いた場合を比較してみました。

OOo Basic では以下のコードの実行に 24 秒ほどかかります。

Sub TreatDataOneByOne
 oDoc = ThisComponent
 oSheets = oDoc.getSheets()
 oDoc.disableSetModified()
 oDoc.IsAdjustHeightEnabled = False
 oDoc.lockControllers()
 oCellRange = oSheets.getByIndex(0).getCellRangeByPosition(0, 0, 100, 1000)
 
 t1 = Timer()
 For i = 0 To 100 step 1
   For j = 0 To 1000 step 1
     oCellRange.getCellByPosition(i, j).setValue(i * j)
   Next
 Next
 t2 = Timer()
 oDoc.unlockControllers()
 msgbox "time: " & (t2 - t1)
 ' 24 sec
End Sub


コードは割愛しますが C++ で拡張機能として同様の操作を行うと 3 秒ほどになります。
実行時間の差は Basic のバインディングによるものです。これ以上速くするのは拡張機能やマクロとして作成する場合には無理です。
具体的にどのようなコードがどのくらいの実行時間で終了することを期待しているのか分かりませんので、これくらいしか書けませんけれども。

導入事例では

M.Kamataki (2011-05-06 20:45:49 (金))

OpenOffice.org日本ユーザー会では大規模な導入事例を以下のページでまとめています。

http://openoffice-docj.sourceforge.jp/wiki/Documentation/introduction_example

わたしがいくつかの導入企業のセミナーを聞いた限りでは、ExcelのマクロをCalcに移行して生産性が向上しないのなら、「マクロ関係だけExcelを使い続けること」を選択されたところもありました。

レガシーなExcelマクロなどはWebアプリケーションへの転換を図るとか、Microsoft Officeからの移行を業務の見直しのきっかけと捉えていただくのが良いと思います。

OpenOffice.orgのマクロが遅いのは事実ですから、変更するしないというのはユーザーの皆さんのご判断にお任せするしかないです。

ここは、ユーザーどうしの情報交換の場です。OpenOffice.orgの開発者が見ているわけではありません。特に責任のある方は海外の方ですから、直接お聞きしたい場合は、英語のメーリングリストでお聞きください。

Excelはなぜ速いの?

mr_happy (2011-05-07 11:45:29 (土))

はにゃ?さん、M.Kamatakiさんありがとうございます。

私の質問の中心はエクセルと比較して遅い原因です。
私も'97までは10年ほどC言語(クイックC)を独学で学んでました。
その時の記憶に依ればマクロはOOoで言う、プロシージャーの前に定義してました。
なのでその経験からVBAやOOoマクロは2段階の変換をしているのかなと、
だからもしかして遅いのかなと。
しかしVBAもOOoも基は一緒のベーシックだと思いますが、それなのになぜOOoはVBAよりかなり遅いのか、という点です。

簡単にいうと、チューニングされていないため

はにゃ? (2011-05-09 01:10:40 (月))

OOo Basic の実行速度が遅い
http://openoffice.org/bugzilla/show_bug.cgi?id=87022
このissueにあるように、チューニング不足だという点が遅い理由です。
開発者のab氏が書いているように、(人的な)リソース不足でチューンアップはできていない、また今後も行える余裕はないようです。
上記のissueはfor文が遅いということが主題ですが、繰り返しセルにアクセスする場合にはその点およびバインディングの速度が重要です。バインディングでは実際のオブジェクトをラップしたオブジェクトからintrospection経由でメソッドを実行します。これは速度的に非常に不利で、OOo Basic での一回のメソッドの呼び出しに対して内部では数十回ものAPIメソッドが呼び出されます。さらに、値をC++からBasicへ変換するためにもうすこし速度が低下します。
最後のコメントにあるように、計算速度や繰り返しで速度が必要であれば Java などのコンパイル言語を利用すべき、というのが OOo 界隈で開発者およびマクロや拡張機能製作者の間で一般的な意見になっています。

経験的には

tani (2011-05-09 10:42:23 (月))

VBAのマクロを見てると、例えば、CSVファイルを一行、一データずつ読み取って、それをシート上のセルに一個ずつ展開していく、といった処理をよく見かけます。
このような処理をそのまま素直にOOo Basicで書き直して実行すると、確かにとんでもなく時間がかかりますね。配列を使ってsetDataArrayとかしてもイマイチです。
いろいろ試したところ、CSVファイルをLoadComponentFromURLメソッドで直で読み込んだあと、書式設定なり必要部分をコピペなり、整形を後回しにする方法が、結果的に一番早く処理できたように思います。

OOo Basicで速度を求めると色々と工夫が必要なようですね。

# あとマクロの記録でとれる、.uno:Hogehogeみたいなコマンドが意外(?)と早いので、有効活用すると良いかもしれません。。。

そういうことですか!??

mr_happy (2011-05-11 10:36:06 (水))

はにゃ? さん ありがとうございます。
大きな一つはチューニング不足ということですか。~
もしかして「オブジェクト指向」にもあるんでしょうかね。

一回のメソッドの呼び出しに対して内部では数十回ものAPIメソッドが呼び出されます。

などは「未熟者の書いたマクロ」みたいな感じですね。

C++からBasicへ変換するため

はC言語中に書いたマクロの事でしょうかね。~

私の扱おうとしてるのは、多くて1200人分のデータぐらいかな。だからそんなに問題にしなくてもよいのでしょうが、なんとなくエクセルでできるのになぜ? と。

taniさん ありがとうございます。

配列を使ってsetDataArrayとかしてもイマイチです・・・・・
直で読み込んだあと、書式設定なり必要部分をコピペなり、整形を後回しにする方法

前者はわかりますが後者の具体的なイメージが湧きません。~
可能ならもう少し具体的に教えていただけると助かります。

とりあえず完了

mr_happy (2011-05-21 09:17:41 (土))

その後の反応がありませんので、とりあえず完了にします。
ありがとうございました。

お名前:
題名: