3

私は現在、非常に大きな MAT ファイル (約 150 MB) の保存/読み込みを含むプロジェクトに取り組んでおり、読み込まれた cell 配列へのアクセスは、スクリプトまたは関数内で作成された同等のバージョンよりもはるかに遅いことに気付きました。

この例を作成して、コードをシミュレートし、違いを示しました。

clear; clc;

disp('Test for computing with loading');

if exist('data.mat', 'file')
    delete('data.mat');
end

n_tests = 10000;
data = {};
for i=1:n_tests
    data{end+1} = rand(1, 4096);
end

% disp('Saving data');
% save('data.mat', 'data');
% clear('data');
% 
% disp('Loading data');
% load('data.mat', '-mat');

for i=1:n_tests
    tic;
    for j=1:n_tests
        d = sum((data{i} - data{j}) .^ 2);
    end
    time = toc;
    disp(['#' num2str(i) ' computed in ' num2str(time) ' s']);
end

このコードでは、MAT ファイルは保存も読み込みもされません。i に対する 1 回の反復の平均時間は 0.75 秒です。ファイルを保存/ロードする行のコメントを外すと、i に対する 1 回の反復の計算に約 6.2 秒かかります (保存/ロード時間は考慮されていません)。違いは8倍遅いです!

Windows 7 64 ビットで MATLAB 7.12.0 (R2011a) 64 ビットを使用しており、MAT ファイルはバージョン v7.3 で保存されています。

MAT ファイルの圧縮に関連している可能性はありますか? またはキャッシュ変数?これを防止/回避する方法はありますか?

4

2 に答える 2

5

私もこの問題を知っています。これは、matlab での非効率的なメモリ管理にも関連していると思います。覚えているように、スワッピングではうまくいきません。150MB のファイルには大量のデータを簡単に保持できます。

mathworks の情報を使用して、あなたの例を簡単に計算しました。 あなたの場合total_size = n_tests*121 + n_tests*(1*4096* 8)は約 313MB です。

最初に、(7.3 ではなく) フォーマット 7 で保存することをお勧めします。この新しいフォーマットを読み取る際のパフォーマンスが非常に悪いことに気付きました。それだけがあなたの減速の理由かもしれません。

個人的には、次の 2 つの方法でこれを解決しました。

  1. データを小さなセットに分割し、必要に応じてデータをロードする関数を使用するか、その場でデータを作成します (クラスでエレガントに実行できます)。
  2. データをデータベースに移動します。SQLite と MySQL は素晴らしいです。どちらも、非常に大きなデータセット (GB ではなく TB) で効率的に機能します。また、SQL 言語は、操作するサブセットをすばやく取得するのに非常に効率的です。
于 2011-11-28T12:14:04.303 に答える
-1

このコードを Windows 64 ビット、matlab 64 ビット 2014b でテストします。

保存と読み込みを行わない場合、計算は約 0.22 秒です。データ ファイルを '-v7' で保存してから読み込むと、計算は約 0.2 秒です。'-v7.3' でデータ ファイルを保存してからロードすると、計算は約 4.1 秒です。つまり、MAT ファイルの圧縮に関連しています。

于 2015-05-10T06:55:59.903 に答える