Claris FileMakerのメモリの内部処理について

FileMaker has a memory bug?

藤本です。
Matt PetrowskyのISO FileMaker Magazineの最新動画が公開されました。
今回は US の FileMaker Community に投稿された以下の報告を検証し、
FileMaker のメモリの内部処理について疑問を呈しています。

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

 

Community での指摘内容

具体的には、US の FileMaker Community への投稿では、
以下のような変数への値の割当てで、
本来不必要な規模のメモリが消費される現象があるようだ、
と書かれていました。

$var = Left ( 5MBのテキスト ; 2 ) // 2文字を保持するだけなのに5MBを消費する
$var2 = Left ( $var ; 1 ) // 1文字を保持するだけなのに5MBを消費する
$var3 = "" & Left ( $var ; 1 ) // 空文字を前につけると、正しく1文字分だけのメモリしか消費しない

さらに次のような対処が必要だと示しています。

  • FileMakerの一部のテキスト処理関数 (例: Left()、GetValue()、すべてのJSON関数)で大量のメモリを消費する場合がある
  • 大量のデータ処理時 (例:外部APIとJSONでデータのやりとりをする場合) にコスト (時間) がかかる

この現象は、Version 13 から最新バージョン (2022年8月現在は19.5.2) までに該当するとのことです。

Matt Petrowsky の ISO FileMaker Magazine の最新動画内での検証

MacOS のアクティビティモニタ を使って、
メモリーが実際にどの程度使用されているのか、
デモの内容を動画で示しています。

結論からいうと、はいその投稿のとおりですね、になりました。

Matt Petrowsky の個人的な対応策は

Matt Petrowsky が自分がこれに対処するとすれば、
外部 API との大量のデータ処理時には、
FileMaker 純正の JSON 関数は使わない。

代わりに BaseElements プラグインの BE_JSON_jq 関数(ただし現在ベータ版とのこと。[訳注]今のところGoyaのマニュアルページに記述はなかった)を使う(BaseElementsをサーバにインストールし、サーバ実行)。
次のメジャーバージョンアップではベータが外れるのではないかとのこと。

また、JSONではない大きなテキスト処理においては、
$var3 = "" & Left ( $var ; 1 )
のような処理を入れたり、そのようなカスタム関数を作って対処するだろう、
とのことでした。

弊社的な対応策は

まず勘違いしないでいただきたいのが、

遅くなるというだけで、結果は正しく取得できる

ので、慌ててなにか対策をする必要はないことをご理解ください。

その上で、JSON はもちろん大量テキストも Web ビューアの JavaScript を使って処理することをオススメすると思います。
これまでも 数分かかっていた処理が数秒で終えられるようになるなど、
絶大な効果を実証済みです。
ただし、この手法の唯一の欠点は サーバー上のスクリプト実行では動作しないことです。
どうしてもサーバー上のスクリプト実行で、JSON処理の高速化が必須だとしたら、
BaseElements プラグインのお世話になると思います。