有很多关于Octave dlmread
表现缓慢的报道。我希望这在3.2.4中得到修复,但是当我尝试加载大小为ca.的csv文件时。 8 * 4 mil(总共32 mil),也花了很长时间。我在网上搜索但找不到解决方法。有人知道一个好的解决方法吗?
答案 0 :(得分:3)
我遇到了同样的问题并且有R方便,所以我的解决方案是在R中使用“read.csv”,然后使用R包“R.matlab”编写一个“.mat”文件,然后加载在Octave。
“read.csv”也可能非常慢,但在我的情况下这非常有用。
答案 1 :(得分:2)
原因是Octave有一个错误,即将数据添加到一个非常大的矩阵需要更多时间,然后将相同数量的数据添加到一个小矩阵。
以下是我的尝试。我选择每50000行保存数据,所以同时我已经可以看一看而不是被迫等待。对于小文件来说速度较慢,但对于较大的文件则要快得多。
function alldata = load_data(filename)
fid = fopen(filename,'r');
s=0;
data=[];
alldata=[];
save "temp.mat" alldata;
if fid == -1
disp("Couldn't find file mydata");
else
while (~feof(fid))
line = fgetl(fid);
[t1,t2,t3,t4,d] = sscanf(line,'%i:%i:%i:%i %f', "C"); #reading time as hh:mm:ss:ms and data as float
s++;
t = (t1 * 3600000 + t2 * 60000 + t3 * 1000 + t4);
data = [data; t, d];
if (mod(s,10000) == 0)
#disp(s), disp(" "), disp(t), disp(" "), disp(d), disp("\n");
disp(s);
fflush(stdout);
end
if (mod(s,50000) == 0)
load "temp.mat";
alldata=[alldata; data];
data=[];
save "temp.mat" alldata;
disp("data saved");
fflush(stdout);
end
end
disp(s);
load "temp.mat";
alldata=[alldata; data];
save "temp.mat" alldata;
disp("data saved");
fflush(stdout);
end
fclose(fid);
答案 2 :(得分:1)
这是我正在使用的解决方法。
我没有发现sscanf将解析输入行,如上所示。另外,我没有使用临时文件。
我的.csv文件有很多行。它们以18行的标题开头,后跟一个数据块,每个数据块有135列。以下代码已经过测试。我的文件也以dd / mm / yyyy hh:mm字段开始每一行。这也将捕获不良行,并通过使用try / catch指示它们的位置。
我的.csv文件来自客户,他将PARCView加载转储到Excel文件中。
function [tags,descr,alldata] = fbcsvread(filename)
fid = fopen(filename,'r');
s = 0;
data=[];
alldata=zeros(1,135);
if fid==-1
disp("Couldn't find file %s\n",filename);
else
linecount = 1;
while (~feof(fid))
line = fgetl(fid);
data2 = zeros(1,135);
if linecount == 1
tags = strsplit(line,",");
elseif linecount == 2
descr = strsplit(line,",");
elseif linecount >= 19
data = strsplit(line,",");
datetime = strsplit(char(data(1))," ");
modyyr = strsplit(char(datetime(1)),"/");
hrmin = strsplit(char(datetime(2)),":");
year1 = sscanf(char(modyyr(3)),"%d","C");
day1 = sscanf(char(modyyr(2)),"%d","C");
month1 = sscanf(char(modyyr(1)),"%d","C");
hour1 = sscanf(char(hrmin(1)),"%d","C");
minute1 = sscanf(char(hrmin(2)),"%d","C");
realtime = datenum(year1,month1,day1,hour1,minute1);
data2(1) = realtime;
for location = 2:134
try
data2(location) = sscanf(char(data(location)),"%f","C");
catch
printf("Error at %s %s\n",char(datetime(1)),char(datetime(2)) );
fflush(stdout);
end_try_catch
endfor
alldata(linecount-18,:) = data2;
if mod(linecount,50) == 0
printf(".");
fflush(stdout);
endif
endif
linecount = linecount + 1;
endwhile
fclose(fid);
endif
endfunction