変数のメモリ消費量の調べ方No.09834
fzok4234 さん 22/04/18 23:30
 
こんばんは、いつもお世話になっております。


さて、マクロで使用中の変数のメモリ使用量を、マクロ実行時にリアルタイムで取得
したいのですが、
どのようにすればよいのでしょうか ?

現状では、変数のメモリ使用量の最大値は 64MB と手狭なため、不適切な変数の使用
方法によって
メモリ不足になりかけていないかどうかを把握したいのですが、簡単な方法が分から
ず困っています。



[ ]
RE:09834 変数のメモリ消費量の調べ方No.09836
秀丸担当 さん 22/04/19 10:45
 
変数の使用量の値を返すようなキーワードや関数は、無いです。
文字列の長さや個数などから、概算で計算するしかないと思います。
最大値がありますが、代入時や関数の返り値など変数相当の一時的なものもあったり、
1つの変数あたりの管理用の情報もあって、実際は3倍くらい確保されています。
使用量を得る方法があったとして、最大値までぴったり計算できるということはなく、
ほとんどの場合、設定よりも余裕があることになります。
getmaxinfoかgetresultexか、そのあたりの番号を使って得られるようにしておこう
と思います。

[ ]
RE:09836 変数のメモリ消費量の調べ方No.09837
fzok4234 さん 22/04/19 11:53
 
回答ありがとうございます。

> 文字列の長さや個数などから、概算で計算するしかないと思います。
> 最大値がありますが、代入時や関数の返り値など変数相当の一時的なものもあった
>り、1つの変数あたりの
> 管理用の情報もあって、実際は3倍くらい確保されています。

ここで少し分からないがいくつかございます。
 1.  数値式の値の消費量。実行処理上は32bit整数版で 32bit ( 4Byte ) 、それ以
外は 64bit ( 8Byte ) で
     扱われているが、実際の消費量もこれと同じかどうか。
 2.  文字列式の値の消費量。実際にメモリ上で扱われる 1 文字当たりの Byte 数が
       ・秀丸単位。すなわち ASCII 範囲は 1Byte 、Shift-JIS 範囲は 2Byte 、U
nicode 範囲は 4Byte 。
       ・UCS-2 単位。通常は 1 文字 2Byte 、サロゲートペアは 4Byte。
       ・UCS-4 単位。1 文字 4Byte 。
       ・上記 3 つ以上に消費している。1 文字 8Byte とか。
     のどれに該当しているのか。
 3.  変数の名前の部分の消費量。現状では変数名には [A-Za-z0-9_\$#] しか使え
ないため、理論上は
     ASCII 文字列として 1 文字 1Byte になるが、果たして実際はこの通りなのか
どうか。
 4.  サブルーチンなどの行ラベル名の消費量。現状ではラベル名には [A-Za-z0-9
_] しか使えないため、
     理論上はASCII 文字列として 1 文字 1Byte になるが、果たして実際はこの通
りなのかどうか。
 5.  「代入時や関数の返り値など変数相当の一時的なものもあったり」とあるが、
この一時的な値の
     メモリ領域は使用後に直ちに解放されるかどうか。
 6.  サブルーチンのローカル変数や実引数のメモリ領域は、サブルーチン終了と同
時に直ちに解放されるか
     どうか。
 7.  まだ値を代入していない変数や配列要素は、参照されても勝手にメモリ領域を
確保することはないのか
     どうか。
 8.  変数を宣言したときに消費される、変数の名前や値の部分を除いた「管理用の
情報」は変数 1 個当たり
     おおよそ何 Byte になるのか。
これらのことが分かればメモリ使用量の合計の概算を立てることができます。



[ ]
RE:09837 変数のメモリ消費量の調べ方No.09838
秀丸担当 さん 22/04/19 13:08
 
実際は3倍くらいというのは、今はそうなっているというだけで、前は2倍くらいの
ときもありました。
具体的に答えたとして、それを仕様と決めて今後もそうなるとは限らないです。
ようは、1MBの設定であれば、総計1MBの文字列を格納したり受け渡し手も耐えうるだ
ろうというサイズを確保しようとしています。
数値の場合は固定のサイズで、文字列の場合の内容は秀丸単位です。

[ ]
RE:09838 変数のメモリ消費量の調べ方No.09840
秀丸担当 さん 22/04/19 13:27
 
あと、V9.12以降ではsetstaticvariable/getstaticvariableで-1を指定する方法も追
加していました。
プロセス間で共有しないという制約がありますが、サイズを気にせず使うことができ
ます。

[ ]
RE:09838 変数のメモリ消費量の調べ方No.09841
fzok4234 さん 22/04/19 13:38
 
> ようは、1MBの設定であれば、総計1MBの文字列を格納したり受け渡し手も耐えうる
>だろうというサイズを
> 確保しようとしています。
> 数値の場合は固定のサイズで、文字列の場合の内容は秀丸単位です。

このことは、変数に代入される数値式と文字列式の容量だけが 1MB 以下になること
を意識していれば通常は
大丈夫、という認識でよろしいでしょうか ?

つまり、変数自体の名前や管理領域のことは特に意識しなくてもよい、ということで
しょうか ?
例えば、あくまで各変数の「名前」は 30 文字近くあるが、変数の「中身」自体は数
値または 2 〜 3 文字程度の
文字列で、このような変数が 1000 個近く定義されていても、
 ( 名前の 30 文字 ) * ( 1000 個 )
という「名前の容量」は無視しても構わない、ということでしょうか ?



[ ]
RE:09837 変数のメモリ消費量の調べ方No.09842
こみやんま さん 22/04/19 13:43
 
チクチク計算するよりも、「このマクロは運用的にあふれる可能性があるぞ」と思っ
たら
「大きくなりそうな変数」から順にメモリ制限がかなり緩いもの に回したほうがい
いと思いますよ。

・dllの値を記憶できるset/get関数へと(マクロ変数を介さずに)代入したり、dllか
ら(マクロ変数を介さずに)取得する。
 (必要であれば共用メモリ化する)

・プロセスを介する必要がないなら 静的変数の-1 オプションのものへと(マクロ通
常変数を介さずに)代入や取得する。
 (私もこの-1の存在最近知ったばかりですが・・・)

大きなバッファーになりそうなものからやれば、多くても変数数個分を退避するだけ
でなんとかなるんじゃないですかね。


秀丸マクロの場合、バッファーがあふれるほぼ全てのシチュエーションは
「大きな文字列を変数で受け取ってしまっているかどうか」に関わってるはずですし。

マクロの配列変数(文字列)で受け取ってしまっている場合もdllのset/getに「キー
とindex」で記憶/復元するような汎用的なもの1つ
作れば良いはずです。

[ ]
RE:09842 変数のメモリ消費量の調べ方No.09844
fzok4234 さん 22/04/19 15:04
 
一応、マクロ中の変数を外部 DLL や静的変数に置き換えることは最終手段として考
えています。

マクロの改良の度に増殖していった全ての変数を全面置き換えするのは、それはそれ
で大変な
作業となるため、とりあえずメモリ消費量が逼迫して変数の全面置き換えが必要かど
うかを
見積もるため、現状のメモリ消費量の計算はできるようにしたいと思っています。



[ ]
RE:09844 変数のメモリ消費量の調べ方No.09845
こみやんま さん 22/04/19 15:18
 
>一応、マクロ中の変数を外部 DLL や静的変数に置き換えることは最終手段として考
>えています。
> ......
>
まあ、この心配したくないから、変数制限の受けにくいhm**シリーズ作った面はあり
ましたかねぇ。

[ ]
RE:09841 変数のメモリ消費量の調べ方No.09846
秀丸担当 さん 22/04/19 18:17
 
普通の使い方であれば、特に意識することは無いと思います。
あるとき2倍から3倍に増やしたのも、管理する用の領域を増やしていたたためでし
た。
とはいえ、別の領域ではないので、意図的に変数名だけで食うような作り方をしたら、
想定外の超え方もありうるかもしれません。
そのような作り方がどうしても必要な場合は、DLLやsetstaticvariableを使ったほう
がいいと思います。

[ ]
RE:09846 変数のメモリ消費量の調べ方No.09849
fzok4234 さん 22/04/20 10:51
 
了解しました。


[ ]