运行与Octave并行的循环部分?

时间:2008-12-08 01:19:03

标签: multithreading parallel-processing octave

我需要在包含超过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 个答案:

答案 0 :(得分:1)

嗯。我不仅仅是Octave的MATLAB人员,但也许我可以提供帮助(如果您仍在寻找解决方案)

这看起来就像我在阅读文件 - 但是我需要做的事情 - 不同于工具提供的问题(否则你可以逃脱dlmread应该很快)。

如果Octave中没有替代方案可以更快,我会尝试使用Java(速度而不是线程);你可以call Java from Octave。 (虽然我没有在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.

答案 1 :(得分:0)

如果您的数据位于文本文件中,最快的方法是使用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列解释为浮点数。这假设您的数据文件类似于

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

此外,str2numstr2double快约3倍(我猜是因为它没有做那么多的错误检查),以防你需要使用更像原始技术的东西。