作成したアプリケーションのデータが変更されない

アプリケーションの作成についてよくわかりません。
ある学習データ(data.csvとして同じフォルダ内に配置)を基に新しいデータの予測をするソースコードをMATLAB上で作成しています。
このソースコードをアプリケーションコンパイラでアプリケーションにし、動作させた場合に、data.csvを変更しても、元のdata.csvに従って計算する場合があります。アプリケーションの中にdata.csvが残っていて、変更しても元のdata.csvを使っているとしか思えないのですが、そういうことは起こりうるのでしょうか。
ちなみに、MATLAB上で動作させると、フォルダ内のdata.csvを変更すると、変更されたdata.csvで計算されます。
コンパイル時に、コンパイルの仕方でアプリケーション内部にデータが残ったりすることがあるのでしょうか。やり方がまずいのでしょうか。
MATLAB上で計算させて確認後、ワークスペースのクリア後にコンパイルしてその後データ変更を行っても元のデータが残っているようです。
漠然としておりますが、ソースが大きすぎて開示するのが困難なので、口頭での説明にて失礼いたします。

Réponses (1)

Kojiro Saito
Kojiro Saito le 9 Sep 2020

0 votes

実行時にMATLAB Runtimeのキャッシュフォルダにdata.csvが置かれるのですが、それが残ってしまって、手元のデータを変更しても反映されていないのかもしれません。
MATLAB Runtimeのキャッシュフォルダは
Windowsの場合、
C:\Users\USERNAME\AppData\Local\Temp\USERNAME\mcrCacheX.X\FUNCTIONNAME\FUNCTIONNAME
Linuxの場合、
/home/USERNAME/.mcrCacheX.X/FUNCTIONNAME/FUNCTIONNAME
になります。
例えば、R2019bの場合、MATALB Runtimeのバージョンは9.7なので、addmatrix.exeを実行すると
C:\Users\USERNAME\AppData\Local\Temp\USERNAME\mcrCache9.7\addmat0\addmatrix
のようにキャッシュフォルダが作られます。
この中にdata.csvが置かれていて、手元のファイルを変更しても、変更が反映されないことがあります。
対処方法としては、一旦data.csvをデスクトップに移動するなどしてMATLABのパス上にない場所に移動させ、アプリケーションコンパイラでコンパイルし、コンパイルが終わったらexeと同じフォルダにdata.csvを置く、などの方法があります。
もしMATLABのバージョンR2020aを使えるなら、ファイルをパッケージに含まないようにするオプションが出ましたので、
mファイルに %#exclude data.csv というプラグマを付けることでコンパイル時にdata.csvが除外されます。

7 commentaires

HIronori Kamachi
HIronori Kamachi le 9 Sep 2020
ご教示いただき、ありがとうございます。
やはりそういうことなのですね。それならば、キャッシュフォルダを消してしまうというのは有効でしょうか。
あと、コンパイル時に、計算に必要と考えられるデータファイル等は、”アプリケーションの実行に必要なファイル”の部分に無かったら明示的に加えておいた方が良いのでしょうか。そして、コンパイル時には移動させておくということでしょうか。ご教示いただけますよう、よろしくお願いいたします。
Kojiro Saito
Kojiro Saito le 9 Sep 2020
キャッシュフォルダの中にあるdata.csvを変更すれば反映されると思います。
キャッシュフォルダを削除し、もう一度EXEを実行すると、開発環境でパッケージに含められたdata.csvが再度解凍されて置かれてしまうので、うまく反映されないかと。
計算に必要なmスクリプトやデータファイルは、アプリケーションコンパイラでメインのmファイルから依存関係が判定され、自動的に含められるようになっています。もし「アプリケーションの実行に必要なファイル」に含まれていなかったら、手動で追加する必要があります。データファイルを配布先で変更する必要がある場合は、コンパイル時に含めないよう移動させておく必要があります。
HIronori Kamachi
HIronori Kamachi le 10 Sep 2020
早速ご教示いただき、ありがとうございます。
個別の条件下における計算では、個別の学習データベース等をフォルダ内に置く建付けなので、必要な学習データベース等無しでコンパイルしましたが、計算が進みませんでした。
原因をいろいろ考えましたら、加えた初期学習データベースと、1回目の情報から、新しい学習データベースを作成するところで止まっているようでしたので、ソースを見直していたところ、ほとんどのdlmreadは計算中の頻繁なファイル読み書きがあるのでreadmatrixに変更していたのですが、ここは初期のデータ読込だけなので、dlmreadを変更しておりませんでした。ここに残っていたdlmreadをreadmatrixに変更したところ、うまく回るようになりました。理由ははっきりとはわかりませんが…
一応、今のところはうまくいっているようです。また、いろいろチェックして以後コメントしようと思います。
どうもありがとうございました。
Kojiro Saito
Kojiro Saito le 10 Sep 2020
ご連絡ありがとうございます。
コンパイル後の実行ファイルをデバッグする際には、ランタイム追加設定でログ出力を有効にしておくとdispの出力結果や、警告、エラーなどがログに出力されるようになります。合わせてご活用いただければと思います。
HIronori Kamachi
HIronori Kamachi le 16 Sep 2020
ご教示いただきありがとうございます。
一応活用してはいるのですが、タイミングによってはログ出力ないまま終了したりすることもあり…(今回のも実はそうでした。)
今回の場合も、ファイル書き込みと読み出しのタイミング等が絡んでいるのではと推測しているのですが…
dlmreadとreadmatrixの決定的な違いでもあるのでしょうか...よくわかりません。
Kojiro Saito
Kojiro Saito le 17 Sep 2020
Modifié(e) : Kojiro Saito le 17 Sep 2020
こちらを読んで原因がわかりました。
データ ファイルの依存関係
上記の実行可能コンテンツに加え、MATLAB Compiler は、次の任意の関数を呼び出して、MATLAB 関数がアクセスするファイルの検出と自動インクルードを行うことができます。audioinfoaudioreadcsvreaddaqreaddlmreadfilereadfopenimfinfoimportdataimreadloadmatfilemmfileinfoopenreadtabletypeVideoReaderxlsfinfoxlsreadxmlreadxslt
コンパイラ アプリを使用している場合、これらのデータ ファイルはアプリの [アプリケーションの実行に必要なファイル] 領域に自動的に追加されます。
dlmreadでは、csvやtxt、matなどのファイルが自動的に「アプリケーションの実行に必要なファイル」に取り込まれます。
dlmreadの例
function testDlmRead
m = dlmread('mydata.txt');
disp(m)
end
アプリケーションコンパイルでコンパイルした時
ただ、readmatrixは上記のドキュメントの関数一覧に無いので、入力ファイルが「アプリケーションの実行に必要なファイル」に取り込まれません。
readmatrixの例
function testReadMatrix
m = readmatrix('mydata.txt');
disp(m)
end
アプリケーションコンパイルでコンパイルした時
アプリケーションの実行に必要なファイルに何も含まれません。
ですので、入力ファイルを変更した場合、readmatrixではコンパイルしたアプリケーションが新しいファイルを読み込みますが、dlmreadではコンパイルしたアプリケーションに入力ファイルが含まれてしまっているので、新しいファイルが反映されない、という挙動の違いになります。
HIronori Kamachi
HIronori Kamachi le 18 Sep 2020
大変よくわかりました。
MATLAB2015で作成したプログラムを改良しながら改訂し、たまにMATLAB自体のバージョンを上げるような感じでしたので、あまり細かいところは気にしておりませんでした。
read/writematrixを使い始めたのも、2019から、エディタのコメントでread/writematrixの使用を推奨されたので、使ってみたら読み込み/書き出しのタイミングで停止したりしていたのが改善したように見えたので、読み込み/書き出しのタイミング等々で大きなファイルの読み込み/書き出しの絡む部分にread/writematrixを使用しておりました。
今後は様子を見ながら、read/writematrixに変更していきたいと思います。
どうもありがとうございました。

Connectez-vous pour commenter.

Catégories

En savoir plus sur MATLAB Compiler dans Centre d'aide et File Exchange

Produits

Version

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!