1

matlab データセットのサブセットを参照して割り当てることは、非常に非効率的であり、行 ^2 のようにスケーリングされる可能性があります。

例:

alldata は混合データの大規模なデータセットです。たとえば、150,000 行 x 25 列 (整数、ブール値、および文字列) です。

データセットの形式は次のとおりです。

'format', '%s%u%u%u%u%u%s%s%s%s%s%s%s%u%u%u%u%s%u%s%s%u%s%s%s%s%u%s%u%s%s%s%u%s'

次に、2 型の整数列を boolean 型に変換します

次のサブセット割り当て:

somedata = alldata(1:m,:)

m = 10,000 の場合は 7 秒以上かかり、m の値が大きい場合はとんでもない時間がかかります。time と m のプロットは、sortrows や find などの関数を使用する場合と同様に、すべてのデータのコピーがほぼ瞬時に行われることを考えると、奇妙な am^2 型の関係を示しています。実際、元の .csv データ ファイルの読み取りは、m の値が大きい場合の上記の割り当てよりも高速です。

プロファイラーを使用すると、文字列比較をチェックしてデータセット内の一意の値を決定する非常に遅い行を含む関数 subref があるようです。これは、データセット タイプの格納方法 (つまり、参照テーブル) に関連していますか? データセットには、多数の一意の文字列値が含まれています。

matlab でデータセットのサブセットを抽出するソリューションはありますか? 事前割り当て (どのように?)、または抽出/サブセットを割り当てるのではなく、データセットをコピーして行を削除するなど。

1.5Gb の RAM を搭載したデュアル コア マシンを使用していますが、タスク マネージャーは使用中の RAM が 1Gb 未満であると報告しています。

4

2 に答える 2

2

私は以前、大規模なデータに対して MATLAB のデータセット配列を使用していましたが、残念ながらパフォーマンスの問題に悩まされているのは事実です。スピードアップに役立つことがわかったのは、観測名(ObsNames)プロパティをクリアすることです

次の修正を試してください。

%# I assume you have a 'dataset' object
ds = dataset(...);

%# clear the observation names property (It simply a label for each record)
ds.Properties.ObsNames = [];
于 2010-09-29T02:16:44.983 に答える
0

アムロは観測名をクリアすることを提案しました:

ds.Properties.ObsNames = [];

これにより、サブセットの割り当てが 2 次 (行 ^2 に対してプロットされた場合は線形) から線形 (行に対してプロットされた場合) に変化するため、ObsNames を失うというわずかなコストで行が変化するため、パフォーマンスが大幅に向上します。

DataSet のコピーはほぼ瞬時に行われるため、不要な行の消去と組み合わせると、パフォーマンスが大幅に向上しますが、最適なソリューションとは言えません (ただし、ObsNames の損失はありません)。ObsNames をドロップする場合と比較して、パフォーマンスは約 2 倍遅くなります。ObsNames も削除された場合、これは 2% だけ改善されます。


サポートデータ

小さなスクリプトを使用して、150,000 x 25 の混合文字列/整数/ブール データセットのサブセット行を割り当て、次の時間測定値 (秒) を生成しました。

メモリ ヒープ サイズによるパフォーマンスの大きな違いはなく、128 MB のままでした。

Subref は、サブセット割り当ての標準関数が使用されたことを意味します

  • ObsNames=[] は ObsNames が削除されることを意味します

  • 削除は、データセットがコピーされ、不要な行が消去されたことを意味します。

行、subref、subref&ObsName=[]、削除、Delete&ObsName=[]

8000、4.19、2.06、4.81、4.72

32000、57.61、2.49、5.26、5.21

72000、390.72、3.21、6.09、6.03

128000、?(*)、4.21、7.25、7.19

(*) この値の評価は諦めました。行 ^2 に対する線形外挿に基づいて、2000 秒または 30 分と推測します。


脚本

clear
load('data'); % load 'alldata' dataset
% alldata.Properties.ObsNames = []; % drop obsnames

tic;
x = ((1:4).^2.*8000);

for h = 1:length(x)
    start = toc;
    somedata = alldata(1:x(h),:);
%     somedata = alldata; 
%     somedata(x(h):end,:) = []; % drop unrequired obs
    t(h) = toc - start;
    clear somedata
    disp([x(h), t(h)]);


end
于 2010-09-29T13:46:09.900 に答える