Запускать части цикла параллельно с Octave? - PullRequest
1 голос
/ 08 декабря 2008

У меня есть следующий код, который мне нужен для запуска матрицы с более чем 20000 строк. Запуск занимает несколько минут, а функции datenum и str2double оказываются узкими местами. Поскольку никакие вычисления не зависят от предыдущих, есть ли способ разбить цикл на несколько частей и выполнять их параллельно? Будем благодарны за любые советы по оптимизации этого кода.

for i=1:length(DJI)
DJI2(i,1)=datenum(char(DJI(i,2)),'yyyy-mm-dd');
for j=3:7
DJI2(i,j-1)=str2double(char(DJI(i,j)));
end
end

Ответы [ 2 ]

1 голос
/ 23 января 2009

Хм. Я скорее человек из MATLAB, чем Octave, но, возможно, я могу помочь (если вы все еще ищете решение)

Это похоже на проблему "я читаю в файле, но мне нужно сделать что-то другое, отличное от инструмента" (в противном случае вы могли бы избежать неприятностей с должно быть довольно быстро).

Если бы в Octave не было альтернативы, чтобы быть быстрее, я бы попробовал использовать Java (для скорости, а не для многопоточности); Вы можете вызвать Java из Октавы . (хотя я не пробовал это в Octave, просто эквивалент MATLAB)

Звонки на str2double выглядят ужасно подозрительно. Возможно, вы сможете векторизовать это, хотя быстрый тест скорости с моей стороны, кажется, подтверждает, что это медленное задание, по крайней мере, в пределах Octave:

octave-3.0.3.exe:15> s=sprintf('1 2\n3 4');
octave-3.0.3.exe:16> m=str2double(s)
m =

   1   2
   3   4


octave-3.0.3.exe:35> s=randn(5000,5);
octave-3.0.3.exe:36> z=num2str(s);
octave-3.0.3.exe:37> tic; s2=str2double(z); toc
Elapsed time is 18.9837 seconds.
0 голосов
/ 11 марта 2010

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

function [DJI2] = InterpretFile(datafile)
    [txtdates, c2, c3, c4, c5, c6] = textread(datafile, '%* %s %f %f %f %f %f');
    dates = datenum(strvcat(txtdates),'yyyy-mm-dd');
    DJI2 = [dates c2 c3 c4 c5 c6];

Строка формата в textread указывает, чтобы пропустить первый столбец, скопировать второй столбец как строку и интерпретировать 3-7-й столбцы как числа с плавающей запятой. Предполагается, что ваш файл данных выглядит примерно так:

skip 1990-01-01 1.234 2.345 3.456 4.012 5.345
skipme2 1990-01-02 1 2 3 4 5
junk 1990-01-03 1.9 2.1 3.2 4.3 5.4

Кроме того, str2num примерно в 3 раза быстрее, чем str2double (я полагаю, потому что он не выполняет столько ошибок), если вам нужно использовать что-то более похожее на вашу оригинальную технику.

...