私はMatlabで書いた動的にメモリを行列に割り当てるスクリプトを高速化しようとしています(基本的に、ファイルからデータの行を読み取り、それを行列に書き込み、次に別の行を読み取り、より大きな行列に多くのメモリを割り当てます)次の行を保存します)。zeroes() などを使用してメモリを事前に割り当てる代わりにこれを行った理由は、すべてのデータを保持するために行列が必要とする正確なサイズがわからないためです。また、マトリックスの最大サイズがわからないため、最大サイズを事前に割り当ててから、使用しなかったメモリを取り除くことはできません。これは少量のデータには問題ありませんでしたが、今ではスクリプトをスケールアップして何百万ものデータ ポイントを読み取る必要があり、この動的割り当ての実装は遅すぎます。
スクリプトを高速化するための試みは次のとおりです。ゼロ関数を使用して大きなブロックにメモリを割り当てようとしました。ブロックがいっぱいになると、別の大きなブロックを割り当てます。サンプルコードは次のとおりです。
data = [];
count = 0;
for ii = 1:num_filelines
if mod(count, 1000) == 0
data = [data; zeroes(1000)]; %after 1000 lines are read, allocate another 1000 line
end
data(ii, :) = line_read(file); %line_read reads a line of data from 'file'
end
残念ながら、これは機能しません。実行すると、「連結されている行列の vertcat ディメンションの使用中にエラーが発生しました」というエラーが表示されます。
だからここに私の質問があります:大きなブロックにメモリを割り当てるこの方法は、実際には増分動的割り当てよりも高速ですか?また、上記のコードが実行されないのはなぜですか? 助けてくれてありがとう。