Engine C API を介して Matlab と通信する C++ コードがいくつかあります。私のコードは、Matlab ワークスペースに一時変数を作成し、clear
できるだけ早く呼び出しを介して入念にクリーンアップします。ただし、ある時点で、アプリケーションが失敗し、次の Matlab 一時変数を作成できないことが通知されます (通常、このような操作が ~65530 回行われた後)。
Matlab コマンド ラインでいくつかの実験を行った後、純粋な Matlab でこの問題を再現できることを発見しました (つまり、C++ コードとエンジン API の使用に関係なく)。次のコードを検討してください。
for i = 1 : 100000
eval(sprintf('x_%d = %d', i, i));
whos
eval(sprintf('clear x_%d', i));
whos
end
Matlab R2008B (古い、私が知っている) を搭載した 32 ビット Windows ラップトップでこのコードを実行すると、ループは最終的にエラー メッセージで中止されます。
現在のワークスペースにはすでに変数が多すぎます。「x_65532」の余地はありません。
したがって、少なくともこの廃止されたバージョンの Matlab には、64K のシンボル テーブル制限があるようです。おそらく、Matlab の新しい (64 ビット) バージョンでは制限が大きくなっています。
ただし、より興味深い問題は、clear
呼び出しがどのような影響を与えているか、およびその奇妙な動作を回避する方法です。以下は、中止の少し前の反復からの出力です。
x_65530 =
65530
Name Size Bytes Class Attributes
i 1x1 8 double
x_65530 1x1 8 double
Name Size Bytes Class Attributes
i 1x1 8 double
ご覧のとおりwhos
、前の反復からの一時オブジェクトがワークスペースから削除されたことを出力が明確に示しており、クリアは期待どおりに機能しているように見えます。それにもかかわらず、シンボル テーブルは明らかに容量に達しています。
それで、SO忠実な人への2つの質問:
- このやや恣意的な制限を回避するにはどうすればよいですか? つまり、私の
clear
呼び出しを何に置き換える必要がありますか? - この動作は、Matlab の新しいバージョンや 64 ビット バージョンで変更されましたか?