Амро предложил очистить имена наблюдений:
ds.Properties.ObsNames = [];
Это приводит к выигрышу в производительности массовое , так как назначение подмножества изменяется с квадратичного (линейного при построении по строкам ^ 2) на линейное(при построении по строкам) со строками с минимальной стоимостью потери ObsNames.
Копирование DataSet происходит практически мгновенно, поэтому в сочетании с очисткой ненужных строк это также приводит к значительному повышению производительности, хотя и несколько меньшеоптимальное решение (но без потери ObsNames).Производительность примерно в 2 раза ниже, чем у ObsNames.Это улучшается только на 2%, когда ObsNames также удаляются.
данные поддержки
Я использовал небольшой скрипт для назначения поднабора строк размером 150 000 x 25Смешанный набор строк / целых / логических данных сгенерировал следующие измерения времени (в секундах).
Размер кучи памяти не имел существенного различия в производительности и остался на уровне 128 МБ.
Subref означает стандартную функцию длябыло использовано назначение подмножества
ObsNames = [] означает, что ObsNames отброшено
Удалить означает, что набор данных был скопирован, а ненужные строки очищены.
Строки, subref, subref & ObsName = [], Delete, 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 секунд или полчаса.
Сценарий
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