15

Matlab に大きな (マルチ GB) 配列があり、切り捨てたい¹。素朴に、切り捨てには多くのメモリは必要ないと思っていましたが、おそらく可能であることに気付きました。

>> Z = zeros(628000000, 1, 'single');
>> Z(364000000:end) = [];
Out of memory. Type HELP MEMORY for your options.

Matlab が巧妙な最適化を行わない限り、切り捨てる前にZ、このコードは実際に(double 型の) 配列を作成364000000:628000000します。この配列は必要ないので、代わりに次のようにします。

>> Z = Z(1:363999999);

この場合、2 番目の例が機能し、私の目的には問題ありません。しかし、なぜそれが機能するのですか?Z(364000000:end) = 0中間配列に必要なメモリが原因で失敗した場合、中間配列に必要メモリが原因で失敗364000000:628000000しないのはなぜですか? もちろん、この中間配列は必要ありません。中間配列を持たずに配列を切り捨てるソリューション、または Matlab が特定のメソッドを最適化する場合に失敗するソリューションのいずれかで満足します。Z = Z(1:363999999)1:363999999

  • 中間インデックス配列を作成せずに配列を切り捨てる方法はありますか?
  • そうでない場合、前述の方法のいずれかが他の方法よりもメモリ効率が高いですか(そうではないようです)?もしそうなら、なぜですか?Matlabは本当に両方の例で中間配列を作成しますか?

¹理由: データを処理していますが、事前に割り当てる量がわかりません。私は経験に基づいた推測を行いますが、多くの場合、割り当てすぎています。使用可能なメモリに基づいてチャンク サイズを選択します。より少ないチャンクに分割するとコードが高速になるためです。したがって、不必要なメモリの使用は避けたいと思います。チャンクによる割り当てに関するこの投稿も参照してください。

4

1 に答える 1