【发布时间】:2013-09-09 08:39:58
【问题描述】:
不胜感激。我正在阅读大约 1M 行数据,使用以下代码需要将近 24 小时。如何提高执行时间?
数组Day 包含从开始到第nth 天的值,并且某一天有多个记录。该程序会检查一个特定的 id(存储在unique_id)是否在 180 天内重复。
%// calculating the number of repeats within 180 days
fid2 = 'data_050913/Unique_id_repeat_count1.xlsx';
fid1 = 'data_050913/data_050913_2000.csv';
fid_data = fopen(fid1);
data = fgetl(fid_data); %// the first line, title line
ep = 0; %// position point number
while 1
data = fgetl(fid_data);
if(length(data)<10)
break;
end
ep = ep+1;
id = find(data == ',');
unique_id(ep) = str2num(data(1:id(1)-1));
day(ep) = str2num(data(id(8)+1:id(9)-1));
end
repeat = zeros(ep,1);
tic
i = 1;
count = 0;
while i <= ep
j = i+1;
while ( (j<=ep) && (day(j)<= day(i)+179) )
if unique_id(i) == unique_id(j)
count = 1;
break;
end
j = j+1;
end
repeat(i,1) = count;
count = 0;
i = i+1;
end
toc
i = 1;
k = 1;
while i<=ep
count = repeat(i,1);
j=i;
while (day(j) == day(i))
count = repeat(j,1)+count;
j = j+1;
if j > ep
break;
end
end
day_final(k,1)= day(i);
repeat_final(k,1) = count;
k = k+1;
i = j;
end
xlswrite(fid2,day_final,'Repeat_Count','A2');
xlswrite(fid2,repeat_final,'Repeat_Count','B2');
谢谢
【问题讨论】:
-
@AkiSuihkonen:几秒钟……你的意思是?
-
只是为了澄清:你的代码的哪一部分占用了这么多时间?如果是第一个循环,请查看@Dr.ABT 的回答和/或阅读有关
textscan、importdata、textread等的信息。您使用过探查器吗? -
您能否在较小的文件(可能 10000 行)上运行它并对其进行分析以查看瓶颈在哪里?
-
关于 break - 是的,这可能是因为它抑制了矢量化(不是 matlab 的那个 - 而是来自编译器的那个 - 参见 en.wikipedia.org/wiki/Vectorization_%28parallel_computing%29 )
-
sort的重点是估计复杂度的下限:通过对所有 id 进行排序,可以更轻松地找到重复项——OTOH,已经有一个内置函数unique()在matlab中。也可以利用 unique(days) 来定位第一个列表中的所有唯一日期;然后迭代它并使用unique(unique_id(days >= dayX .* days <= (dayX + 179)));
标签: arrays matlab loops execution-time