皆さんこんにちは、みっくです。
FileMaker Pro 2023 の修正された問題の中で、こちらの件に注目してみます。
- Left や GetValue などのテキスト短縮関数が必要以上のメモリを使用する。
必要以上のメモリを使用されないように修正された、とのことです。
Left や GetValue などのテキスト短縮関数とは、つまり文字を一部取り出すような関数なので、Substitute も当てはまりそうですね。
どんな改善がされたのか、検証してみたいと思います!
データビューアでの確認方法
前バージョンの 19.6 と FileMaker Pro 2023 での動作を比較して検証します。
まずはデータビューアでの計算式の評価で確認してみたいと思います。
FileMaker を開いて、データビューアの計算式に下記の計算式をコピペします。
この計算式は Claris コミュニティ(US) のこちらの投稿者さんが検証用に記載してくれているものです。
Catastrophic memory allocation issue with substring functions in all versions of FM since 13.0
https://community.claris.com/en/s/question/0D53w00005jgQVxCAM/catastrophic-memory-allocation-issue-with-substring-functions-in-all-versions-of-fm-since-130
Let 関数で、3つの Let 内変数を定義し、その変数が評価されるまでにかかる時間を Get ( 現在の時刻 UTC ミリ秒 ) で計測したものです。
Let ( [
// ~5MB text
text = Substitute ( 10^32-1 ; [ 9 ; 10^400-1 ] ; [ 9 ; 10^400-1 ] ) ;
var = Left ( text ; 2 ) ;
start = Get ( CurrentTimeUTCMilliseconds ) ;
x = While ( i = 0 ; i < 100 ; [ i = i + 1 ; x = Left ( var ; 1 ) ] ; x ) ;
log = "Left(Substitute()) – " & Get ( CurrentTimeUTCMilliseconds ) - start & " ms" ;
// ~5MB array
text = JSONSetElement ( "[]" ; 10^6 ; "" ; JSONNull ) ;
var = Left ( text ; 2 ) ;
start = Get ( CurrentTimeUTCMilliseconds ) ;
x = While ( i = 0 ; i < 100 ; [ i = i + 1 ; x = Left ( var ; 1 ) ] ; x ) ;
log = List ( log ; "Left(JSONSetElement()) – " & Get ( CurrentTimeUTCMilliseconds ) - start & " ms" ) ;
// fix memory allocation
var = "" & Left ( text ; 2 ) ;
start = Get ( CurrentTimeUTCMilliseconds ) ;
x = While ( i = 0 ; i < 100 ; [ i = i + 1 ; x = Left ( var ; 1 ) ] ; x ) ;
log = List ( log ; "\"\" & Left(JSONSetElement()) – " & Get ( CurrentTimeUTCMilliseconds ) - start & " ms" )
] ; log )
※本記事は下記検証端末、バージョンにて確認している内容になります。
MacBook Air
M1, 2020
メモリ16GB
OS Ventura 13.3.1
19.6 での実行結果
Left(Substitute()) – 62 ms
Left(JSONSetElement()) – 112 ms
"" & Left(JSONSetElement()) – 0 ms
以前のバージョンでは、このような結果でした。上2行が標準の関数を使用したもので、少し時間がかかっているのが分かります。
変数定義する際、頭に “” & をつけると0ミリ秒に短縮できていたようです。
FileMaker Pro 2023 での実行結果
Left(Substitute()) – 0 ms
Left(JSONSetElement()) – 0 ms
"" & Left(JSONSetElement()) – 0 ms
こちらはいずれも0ミリ秒に短縮されました。
ミリ秒なんて普段使っていて特に気にならないくらいの誤差ではありますが、この誤差が様々な要因によって大きな差に広がっていく可能性もあります。ほんの僅かの差であっても、改善されているのが確認できて良かったな、と思います。
サンプルファイルでの確認方法
先ほどの Claris コミュニティ(US) 投稿で、サンプルファイルを添付してくれていますので、ありがたく使わせていただきましょう。
Compare Memory Allocation ボタンを押すと、変数が定義されそれぞれの計算式とともにダイアログが表示されます。
後ろでアクティビティモニタを表示しておいて、ダイアログの表示ごとに FileMaker の現在のメモリ状況を確認します。
19.6 での実行結果
5MBのデータセットに対して、1〜2GBとメモリがかなり増えていることがわかります。
こちらも頭に “” & をつけると改善されていました。
FileMaker Pro 2023 での実行結果
こちらは、通常の計算式でもメモリの増加は起こらなくなりました。
今回このように新バージョンにおいて改善されたということで、ほっとひと安心ですね。
今まで通り GetValue や Substitute や JSON といった関数をどんどん活用していきたいと思います。