2010-09-29 2 views
1

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

Пример:

ALLDATA большой набор данных смешанных данных - скажем, 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 типа целочисленных COLS в тип булевой

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

somedata = alldata(1:m,:) 

занимает> 7 сек для т = 10 000 и смешное количество времени для больших значений m. Время построения vs m показывает связь типа m^2, которая является странной, учитывая, что копирование alldata происходит почти мгновенно, а также использует такие функции, как сортировки и поиск. Фактически чтение исходного файла данных .csv происходит быстрее, чем указанное выше назначение для больших значений m.

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

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

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

+0

Не могли бы вы дать нам пример снимок базы данных? Всего несколько строк и все столбцы. – Jacob

+0

Ummm - данные ... чувствительные. Он состоит главным образом из идентификатора наблюдения, нескольких ссылочных идентификаторов, хранящихся в виде строк, нескольких полей даты (которые хранятся в строках, пока я еще не начал работать с ними), два булевых столбца, несколько целочисленных полей (большинство одно целое) и целая куча других строковых полей (обычно менее 20-30 символов). Я могу дать вам фактическую последовательность типов переменных, если это поможет? – Vahid

+0

Вот пример того, кто имеет такую ​​же проблему: http: //www.mathworks .com/matlabcentral/newsreader/view_thread/268923 # 704052 – Vahid

ответ

2

Я ранее работал с массивом MATLAB dataset для больших данных, к сожалению, это правда, что они страдают от проблем с производительностью. Одна вещь, которую я обнаружил, что помогает ускорить процесс, чтобы очистить observation names (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

Спасибо Amro - дадим эту попытку. В целом, любые рекомендации или рекомендации по альтернативным структурам для лучшей производительности? – Vahid

+0

в теории вы должны быть в состоянии делать все с помощью матриц и ячеистые массивы, чуть более неудобно .. – Amro

0

Amro предложил расчистке имена наблюдения:

ds.Properties.ObsNames = []; 

Это приводит к массивный выигрыш в производительности, так как назначение подмножества изменяется от квадратичного (линейное, если оно построено по строкам^2) до линейного (при построении по строкам) с строками при незначительной стоимости потери ObsNames.

Копирование DataSet происходит почти мгновенно, поэтому в сочетании с очисткой ненужных строк также приводит к значительному улучшению производительности, хотя и немного менее оптимальному (но без потери ObsNames). Производительность примерно в 2 раза медленнее по сравнению с уменьшением ObsNames. Это улучшает только на 2%, когда ObsNames также отбрасываются.


опорных данные

Я использовал небольшой скрипт, чтобы назначить подмножество строк в 150 000 х 25 смешанных строках/целом/булев набор данных генерируются следующее время измерения (в секундах).

Размер кучи памяти не оказал существенной разницы в производительности и остался на уровне 128 МБ.

Subref означает стандартную функцию для назначения подмножества использовали

  • ObsNames = [] означает, что ObsNames отбрасываются

  • Удаление означает набор данных был скопирован и ненужные строки очищается.

Ряды, subref, subref & ObsName = [], Удалить, Удалить & 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 сек, или полчаса.


Script

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