Извлечение больших подмножеств набора данных Matlab - PullRequest
1 голос
/ 29 сентября 2010

Ссылка и назначение подмножества набора данных Matlab представляется крайне неэффективным и, возможно, масштабируется как строки ^ 2

Пример:

Все данные представляют собой большой набор данныхсмешанные данные - скажем, 150 000 строк на 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 типа в тип логический

следующее назначение подмножества:

somedata = alldata(1:m,:)

занимает> 7 секунд для m = 10000 и смешное количество времени для больших значений m.Время прорисовки vs m показывает отношение типа am ^ 2, что странно, учитывая, что копирование всех данных происходит практически мгновенно, как и использование функций типа sortrows и find.На самом деле чтение исходного файла данных .csv в выполняется быстрее, чем приведенное выше назначение для больших значений m.

При использовании профилировщика, кажется, есть функция subref, которая содержит очень медленную строку, которая проверяет сравнение строкопределить уникальные значения в наборе данных.Связано ли это с тем, как хранится тип набора данных (т. Е. Справочная таблица)?Набор данных содержит большое количество уникальных строковых значений.

Есть ли у них какие-либо решения для извлечения подмножества набора данных в matlab?Например, предварительное распределение (как?) Или копирование набора данных и удаление строк вместо назначения извлечения / подмножества.

Я использую двухъядерный компьютер с оперативной памятью 1,5 ГБ, но диспетчер задач сообщает о менее 1 ГБ оперативной памяти.используется.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2010

Ранее я работал с массивом MATLAB dataset для больших данных, к сожалению, они действительно страдают от проблем с производительностью. Одна вещь, которую я нашел, которая помогает ускорить процесс, это очистить имена наблюдений (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 = [];
0 голосов
/ 29 сентября 2010

Амро предложил очистить имена наблюдений:

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
...