主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

メモリ不足エラーの解決

このトピックでは,MATLAB®がメモリ不足になった場合に使用できるいくつかの方法を説明します。MATLABは、64 ビット オペレーティング システム上で稼働する 64 ビット アプリケーションです。オペレーティング システムに対して使用可能なメモリより大きなセグメントを要求する場合、MATLAB はエラー メッセージを返します。

MATLABには,大きすぎる配列が作成されるのを防ぐ,組み込みの保護機能があります。既定では,MATLABはコンピューターのRAM(バーチャルメモリを除く)を最大100%まで使用して配列にメモリを割り当てることができ,配列がそのしきい値を超えると,MATLABはエラーを返します。たとえば,次のステートメントは,無理なサイズの配列の作成を試みます。

一个=兰德(1 e6, 1 e6);
使用rand请求的1000000x1000000 (7450.6GB)数组超过了最大数组大小首选项。创建超过这个限制的数组可能需要很长时间,并导致MATLAB变得无响应。更多的信息
この配列サイズ制限の調整の詳細については,ワークスペースと変数の基本設定を参照してください。配列サイズの制限をオフにすると,MATLABは異なるエラーを返します。

一个=兰德(1 e6, 1 e6);
内存不足。更多的信息

メモリ制限の問題がいかに生じたかに関わりなく,目的に応じていくつかの解決策が利用できます。メモリを効率的に使用するための対策で説明されている以下のような手法は,使用可能なメモリの最適化に役立ちます。

既にメモリを効率的に使用していても問題が解決されない場合は,このページの以降の節に解決策が見つかるかもしれません。

配列の活用

メモリに収まらないデータの高配列は,大きすぎてメモリに収まらないデータセットの操作に役立つよう設計されています。MATLABでは、データを小さなブロックごとに操作し、データのチャンク化や処理はすべてバックグラウンドで自動処理されます。tall 配列の活用方法は主に 2 つあります。

  1. メモリには収まるものの,計算を実行しようとするとメモリ不足となるような大規模な配列がある場合は,その配列を高配列にキャストできます。

    B =高(A)
    この方法により,メモリには収まるものの,メモリ消費量が多すぎて計算中にデータのコピーができないような,大規模な配列を扱えるようになります。たとえば,8 GB RAMのと5 GBの行列がある場合,この行列を高配列にキャストすると,メモリ不足を発生させずに行列の計算を実行できます。この使用法の例は,インメモリ配列から高配列への変換を参照してください。

  2. ファイルまたはフォルダーベースのデータがある場合は,数据存储を作成してから,そのデータストアに基づく高配列を作成できます。

    ds =数据存储(“路径/ / data.csv”);tt =高(ds);
    この方法により,MATLABの高配列を最大限に活用できます。データは任意の行数をもつことができ,MATLABでメモリ不足は発生しません。また,数据存储はローカルとリモート両方のデータの場所で機能するため,扱うデータを解析するために,そのデータが使用中のコンピューター上にある必要はありません。詳細については,リモートデータの操作を参照してください。

複数のマシンのメモリの活用

コンピュータークラスターを使用している場合は,并行计算工具箱™分散配列(并行计算工具箱)を使用し,クラスター内のすべてのマシンのメモリを結合して計算の実行に使用することができます。これにより,分散配列全体を単一のエンティティとして操作できるようになります。ただし,ワーカーは自己担当部分の配列のみを操作し,必要に応じてワーカー間で自動的にデータを転送します。

分散配列の作成は,高配列の作成とよく似ています。

ds =数据存储(“路径/ / data.csv”);dt =分布式(ds);

必要なデータのみの読み込み

メモリの問題を解決する別の方法として,問題を解くために必要な部分のみを大規模なデータセットからMATLABにインポートすることが考えられます。クエリに一致する要素を明示的に検索できるデータベースなどのソースからインポートする場合は,こうした問題はありません。ただし,大規模なテキストファイルやバイナリファイルを読み込む場合には共通する問題となります。

関数数据存储を使うと,大規模なデータセットを段階的に操作できるようになります。この関数はメモリに収まらないデータの高配列分散配列(并行计算工具箱)の基盤となるものですが,他の目的にも使用できます。データストアは,データセットの小部分を一度にメモリに読み込む場合に常に有用です。

データストアを作成するには,ファイルの名前,または類似形式のファイルのコレクションを含むディレクトリの名前を指定する必要があります。たとえば,単一のファイルでは次のようになります。

ds =数据存储(“路径/ / file.csv”
あるいは,フォルダー内のファイルのコレクションでは次のようになります。
ds =数据存储(的路径/ /文件夹/
また,次のように,ワイルドカード文字を使用して特定タイプのファイルをすべて選択することもできます。
ds =数据存储(“数据/ * . csv”
データストアでは,さまざまな一般的なファイル形式(表形式データ,イメージ,スプレッドシートなど)がサポートされています。詳細については,ファイル形式またはアプリケーション用のデータストアの選択を参照してください。

データストア以外にも,MATLABには,垫ファイルの一部を読み込む関数matfileなど,ファイルの一部を読み込む他の関数がいくつかあります。次の表は,部分読み込みを行う関数をファイルの種類別にまとめています。

ファイルの種類 部分読み込み
垫ファイル

関数matfileで作成するオブジェクト内にインデックスを付けることにより,変数の部分を読み込みます。この使用法の例は,MAT文件中的大数据を参照してください。

テキスト

選択された列と行のみを読み込むことによって,大規模なテキストファイルの一部にアクセスするには,関数textscanを使用します。textscanで,行数,または繰り返される形式番号を指定すると,MATLABで必要な正確なメモリ量があらかじめ計算されます。

バイナリ

既知の形式をもつファイルの一部にアクセスするには,从文件中读などの低レベルバイナリファイルI / O関数を使用できます。形式がわからないバイナリファイルの場合は,関数memmapfileを使ってメモリマッピングを試してみます。

イメージ,HDF,オーディオ,ビデオ

MATLAB関数の多くはこのようなタイプのファイルからの読み込みをサポートし,それらを使用して,読む取るデータの一部を選択できます。詳細は,インポートとエクスポートでサポートされるファイル形式にリストされている関数のリファレンスページを参照してください。

システムのスワップスペースの拡大

コンピューター上のアプリケーションで使用可能な総メモリは,ディスク上の物理メモリと(RAM),“ページファイル”,すなわち“スワップファイル”で構成されます。スワップファイルは非常に大きくなることがあります(たとえば,64ビット窗口®512年上でテラバイト)。オペレーティングシステムでは,システム自体と他のプロセスのニーズに応じて,各プロセスのバーチャルメモリが物理メモリまたはスワップファイルに割り当てられます。スワップファイルのサイズを大きくすると使用可能な総メモリを増やせますが,通常はパフォーマンスの低下にもつながります。

ほとんどのシステムでは,スワップファイルのサイズを制御できます。必要な手順は,オペレーティングシステムによって異なります。

  • Windowsシステム——Windowsのコントロールパネルを使用して,システムにおけるバーチャルメモリページングファイルのサイズを変更します。詳細は,Windowsのヘルプを参照してください。

  • Linux®システム——スワップスペースは,mkswapコマンドとswaponコマンドを使用して変更できます。詳細を表示するには,Linuxプロンプトで”男人。“と入力し,コマンド名を続けます。

macOSシステムには,スワップスペースを直接制御するインターフェイスはありません。

Linuxシステムにおけるプロセスリミットの設定

“プロセスリミット”は1つのプロセス(またはアプリケーション)で扱うことができるバーチャルメモリの最大量です。まれにこの基本設定を設定した場合は,以下を格納する十分な大きさにしなければなりません。

  • 処理するすべてのデータ

  • MATLABプログラムファイル

  • MATLABの実行可能ファイル自体

  • 追加の状態情報

64年ビットオペレーティングシステムは,8テラバイトのプロセスリミットをサポートしています。Linuxシステムで,バーチャルメモリを含むユーザーリミットを表示および設定するには,ulimitコマンドを参照してください。

LinuxシステムでのJavaVMの無効化

Linuxシステムで,Java®JVM™を使用せずにMATLABを起動すると,使用可能なワークスペースメモリを約400メガバイト増やすことができます。Java JVMを使用せずにMATLABを起動するには,コマンドラインオプション-nojvmを使用します。このオプションは,最大連続メモリブロックのサイズもほぼ同量増やします。最大連続メモリブロックを増やすことで,最大行列サイズも可能な限り増やせます。

-nojvmを使用すると,開発環境全体も含めた,Javaソフトウェアに依存する多くの機能が失われるという不利な点があります。-nodesktopオプションを使用してMATLABを起動しても,あまりメモリの節約にはなりません。

参考

関連するトピック