TS工房 -技術者と研究者とモノづくり-

音楽や芸術のスタジオやアトリエの様な雰囲気の工房で、研究者として・技術者として”ものづくり”をしたい

MENU

【LabVIEW】大容量バイナリファイルを読み込んだらメモリがいっぱいですエラー

現在進行中の悩みです。。

二週間くらいかけて完成させたLabVIEWプログラムだったのですが、使いだしてみると大小さまざまなバグや修正箇所がたくさん出てきます。このうちバグの一つが、題名のとおり「大容量バイナリファイルを読み込んだらメモリがいっぱいです」のエラーです。

f:id:wannavi:20210113001034j:plain

メモリエラー

メモリ管理や実行速度を意識して組んでいたつもりだったのですが、想定よりも重いファイルではテストをしていなかったため最後まで気づきませんでした。ちなみに当初の想定では、バイナリファイルのファイルサイズは最大100MBで、エラーを起こした際のファイルサイズは250MBでした。

プログラムを調べてみると、原因は「割り算による自動型変換」でした。下の図がやらかした部分の例です。

f:id:wannavi:20210112235727p:plain

自動で型変換されてしまう

大容量ファイルの中身は16bit配列なのですが、途中割り算をすることでオレンジ色の線に示す64bit配列になっています。無駄なメモリを消費しないために再び型変換をして16bit配列に抑えていました。ここでメモリエラーを起こしていたのは、オレンジ色の64bit配列になっている部分です。LabVIEWのプログラム上で線こそは短いですが、250MB(16bit)のファイル(配列)を64bitの精度で読み直していることから、オレンジ色の線の部分は1GBの連続メモリを要求していることになるわけですね。これではエラーを起こすのも無理ないでしょう。

そこで大容量ファイルの読み取り部分を考え直す必要があるという結論に至りました。プログラムを修正する前に、そもそもLabVIEWで扱えるデータサイズなどが気になったため、以下にメモしておきます。

LabVIEWで扱えるデータサイズはどれくらいまでか

ちゃんとNIの公式ページに記載がありました。以下は、「どのくらいのメモリをLabVIEW 32ビットまたは64ビットに割り当てることができますか?」からの引用です。

LabVIEWが使用できるメモリ容量は、使用しているバージョンとオペレーティングシステムによって異なります。

LabVIEW (32-bit)

32ビットWindowsオペレーティングシステムでは、LabVIEWはデフォルトで最大2 GBの仮想メモリにアクセスできます。 ただし、これはブート構成データストアを変更することで3 GBまで拡張できます。

64ビットWindowsオペレーティングシステムでは、LabVIEWは変更なしで最大4 GBの仮想メモリにアクセスできます。

LabVIEW (64-bit)

Windows Vista(64ビット)、Windows 7(64ビット)、Windows 8(64ビット)、およびWindows 10(64ビット)でLabVIEW 2009(64ビット)以降を使用する場合、LabVIEWは最大16 TBの仮想メモリを使用できます。

 

ちょっとした感想

C言語のようなテキストベースのプログラミング言語では、メモリ管理がとても重要です。逆に言えば、いちいちプログラマがメモリを気にしてあげないといけません。メモリを使用する前にメモリを割り当て、メモリの使用を終了したらメモリを開放してと。。。

LabVIEWMATLABでもそうなのですがこれらの言語では、新しい情報を管理するために十分なメモリが自動的に割り当てられる、つまりメモリ管理をあまり意識しなくて良いというのがメリットだなと思っていました。

ただ今回のようなメモリエラーに直面すると、自動処理であるがためのデメリットもあるのだなと感じます。明日以降、大容量ファイルの読み取り部分を考え直すこととしていますので、良い方法が見つかればこの場でご報告をしたいと思います。