マクロの動作スピード低下についてNo.32043
surebass さん 13/02/26 16:30
 
数万行のCSVファイルを1行ずつ整形処理するマクロを作りました。
(そもそも秀丸でする処理じゃないだろ?という話はおいといて)

スタート直後は「秒速数十行」くらいのスピードなのですが、徐々に遅くなっていき、
5000行あたりで「秒速5行」、2万行当たりになると「秒速1行」くらいになってしま
います。
(7万行を完走するのに14時間くらいかかりました)

すべての行に対し同じ処理をしている心算なのですが、徐々に遅くなる原因としてど
のようなことが考えられるでしょうか?
(行番号を+1しながら次の行に移動しています)

漠然とした書き方しかできなくてアドバイスが受けにくいことは判っているのですが、
お気づきの点があれば教えてください。

[ ]
RE:32043 マクロの動作スピード低下についNo.32044
Imabeppu さん 13/02/26 16:50
 
Imabeppu です。

> すべての行に対し同じ処理をしている心算なのですが、徐々に遅くなる原因としてど
> のようなことが考えられるでしょうか?

マクロを見ないとわからないですが、各行に加工を施しているとなると、
それに伴った再計算か何かが秀丸エディタの中で動作するのだと思いま
す。たとえば、行番号を再計算するような処理が動作するのだとすると、
ファイルの後ろに行けば行くほど遅くなる可能性はあります。

何が動作するかはわかりませんが、描画を抑止することで改善する可能
性はあります。すでに実施済みかもしれませんが、もしも実施済みでな
ければ以下の様なことを試してみてください。

  ・マクロの先頭で disabledraw を実施
  ・マクロの終了時に enabledraw を実施

以上です。

[ ]
RE:32043 マクロの動作スピード低下についNo.32045
秀まるお2 さん 13/02/26 22:08
 
 行の挿入/削除、つまり行数が増えたり減ったりするような編集は、ファイル
の末尾の方での編集の方が遅いっていうのはあります。

 なるべく行数が変化しないようにマクロを作っていただくと高速になるかなぁ
と思います。

 あと他に、「ファイルタイプ別の設定・体裁・詳細」の「行番号の計算方法」
が「エディタ的」になってると、これまたファイルの末尾の方での編集が遅くな
ります。これを「ワープロ的」にしてもらうと多少速くなるかもしれません。


--------------------------------------------------------------------
 固定パターンの編集を繰り返すだけなら、タグ付き正規表現を使った全置換が
もし可能なら、それを使うことでものすごく高速に編集させることは出来るかな
ぁと思います。例えばCSV形式での1列目と2列目を入れ替えるなら、

検索:  ^(.*?),(.*?)(,|$)
置換:  \2,\1\3

 とかで出来たりします。

 CSV形式での編集で、例えばどういうことをしたいとかっていうのを例を使う
等して説明していただければ、タグ付き正規表現の置換が出来るかどうか、出来
るとしたら、その正規表現パターンの例をお返事することは出来るかなぁと思い
ます。

[ ]
RE:32045 マクロの動作スピード低下についNo.32046
秀まるお2 さん 13/02/26 22:29
 
>  なるべく行数が変化しないようにマクロを作っていただくと高速になるかなぁ
> と思います。

 マクロ内容にもよりますが、「ファイルタイプ別の設定・体裁」の「折り返
し」を「最大」にすると、それによって行の増減が抑制されて、結果マクロが高
速に動作することはあります。

[ ]
RE:32043 マクロの動作スピード低下についNo.32047
surebass さん 13/02/27 09:08
 
みなさま、ありがとうございます。

・マクロ実行中は画面描画を止めています。
・行折り返しは「最大」です

配列の要素数が増えると処理が遅くなるということはありますでしょうか?

元のCSVファイルを操作・計算して、新しいCSVを生成する処理です。
計算結果を配列に格納して最後に配列情報をCSVに書き出すという処理になります。

使っている2次元配列の要素数的には「20000」くらいです
(配列を元に縦200×横100マスのCSVを作っています)

コードを見直すもなにも要素数が多すぎる…ということであれば諦めもつきます。

[ ]
RE:32047 マクロの動作スピード低下についNo.32048
秀丸担当 さん 13/02/27 10:15
 

配列の要素数が非常に多い場合の確認をしてみたところ、変数の数が非常に多く
なると遅くなる傾向が見られました。
おそらくそのことが原因と考えられると思います。
改善できないか検討します。

1つ気をつける点がありまして、変数には上限があります。
上限に達するとエラーで止まってしまう可能性があります。
昔のバージョンはかなり少なかったのですが、バージョンアップでだんだん上限
を増やして現在は標準で約1MBが上限で、設定で指定することができます。
[その他]→[動作環境]→[環境]で、「マクロ変数の上限」で指定することができ
ます。

[ ]
RE:32048 マクロの動作スピード低下についNo.32049
surebass さん 13/02/27 10:41
 
>配列の要素数が非常に多い場合の確認をしてみたところ、変数の数が非常に多くな
>ると遅くなる傾向が見られました。

要素数20000は多いんでしょうね・・・

>おそらくそのことが原因と考えられると思います。
>改善できないか検討します。

無計画に増築したマクロなので、これを機に書き直そうとも思いつつ、
しかし、要素数が原因なら書き直しても意味がないのかな?と思ってのお尋ねでした。

ありがとうございます。

>1つ気をつける点がありまして、変数には上限があります。

エラーで止まらなかったので、1MBを越えてないんだろうなぁ?とは思っていました。

[ ]
RE:32049 マクロの動作スピード低下についNo.32050
IKKI さん 13/02/27 11:44
 
こんにちは。ユーザーの IKKI です。横から失礼します。

> 要素数20000は多いんでしょうね・・・
ちょうど10年前に、こんな実験を行いました。
http://mobitan.org/hm/memo/030226.shtml
当時の感覚では、変数の数が 20 個を超えたら別の方法を検討するべきでした (今で
は違うかもしれません)。

> 改善できないか検討します。
これは、かなり期待したいところです。

> 計算結果を配列に格納して最後に配列情報をCSVに書き出すという処理になります。
秀丸マクロでは (今のところ) このやり方は禁忌と言っていいです。
各行のデータ間に依存関係がないなら、「読み込み→処理→書き出し」を1行ずつ
別々に行うのがいいと思います。

大量のデータをどうしてもマクロ内で扱わなければならない場合は、次のような代替
手段があります。

 ・writeinistr, getinistr (変数よりはるかに速いです)
 ・setstaticvariable, getstaticvariable
 ・田楽 DLL のグローバル変数
 ・COM の FileSystemObject でファイルに書き出す
 ・隠しウィンドウに書き出す (おすすめしません)

以上、ご参考になれば幸いです。

秀丸エディタ v8.30β25 + HMJRE.DLL v3.50

[ ]
RE:32050 マクロの動作スピード低下についNo.32051
秀丸担当 さん 13/02/27 12:09
 

変数処理の改善について、コアな部分なので慎重に考えたいところですが、1つ
ボトルネックとなっていそうな部分を見つけたので、ボトルネックを取り除くよ
うな方向で考えたいと思います。

[ ]
RE:32051 マクロの動作スピード低下についNo.32078
surebass さん 13/03/06 12:08
 
早速、V8.30 Beta26にてテストしてみました。

従来、完走に15時間かかっていたマクロが1時間弱で終わってしまいました。
すごい結果です。
ありがとうございます。

また、アドバイスいただけました方々につきましても、この場を借りてお礼を申し上
げます。
ありがとうございました。

[ ]