MATLAB Answers

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

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

  0 件のコメント

サインインしてコメントする。

回答 (1 件)

Kojiro Saito
Kojiro Saito 2020 年 9 月 9 日
実行時に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 件のコメント

表示 4 件の古いコメント
HIronori Kamachi
HIronori Kamachi 2020 年 9 月 16 日
ご教示いただきありがとうございます。
一応活用してはいるのですが、タイミングによってはログ出力ないまま終了したりすることもあり…(今回のも実はそうでした。)
今回の場合も、ファイル書き込みと読み出しのタイミング等が絡んでいるのではと推測しているのですが…
dlmreadとreadmatrixの決定的な違いでもあるのでしょうか...よくわかりません。
Kojiro Saito
Kojiro Saito 2020 年 9 月 17 日
こちらを読んで原因がわかりました。
データ ファイルの依存関係
上記の実行可能コンテンツに加え、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 2020 年 9 月 18 日
大変よくわかりました。
MATLAB2015で作成したプログラムを改良しながら改訂し、たまにMATLAB自体のバージョンを上げるような感じでしたので、あまり細かいところは気にしておりませんでした。
read/writematrixを使い始めたのも、2019から、エディタのコメントでread/writematrixの使用を推奨されたので、使ってみたら読み込み/書き出しのタイミングで停止したりしていたのが改善したように見えたので、読み込み/書き出しのタイミング等々で大きなファイルの読み込み/書き出しの絡む部分にread/writematrixを使用しておりました。
今後は様子を見ながら、read/writematrixに変更していきたいと思います。
どうもありがとうございました。

サインインしてコメントする。

Community Treasure Hunt

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

Start Hunting!