我有一个包含三列的非常激烈的csv文件。现在我想尽可能快地将这些列加载到matlab矩阵中。
目前我所做的就是这个
Workers<T>
然而,对于200 000行,这需要约30秒。这意味着每行150μs。这真的很慢。 parfor不接受该代码。
现在我想知道导致for循环瓶颈的原因以及我如何加快它的速度。
这里测量的时间:
str2double 578253调用29.631s
strsplit 192750调用13.388s
编辑: 内容在文件
中具有此结构 fid = fopen(inputfile, 'rt');
g = textscan(fid,'%s','delimiter','\r\n');
tdata = g{1};
fclose(fid);
results = zeros([numel(tdata)-4], 3);
tic
display('start reading data...');
for r = 4:numel(tdata)
if ~mod(r, 100)
display(['data row: ' num2str(r) ' / ' num2str(numel(tdata))]);
end
entries = strsplit(tdata{r}, ',');
results(r-3,1) = str2double(strrep(entries{1},',', '.'));
results(r-3,2) = str2double(strrep(entries{2},',', '.'));
results(r-3,3) = str2double(strrep(entries{3},',', '.'));
end
答案 0 :(得分:1)
如果您使用csvread
,则不需要使用str2double
或strsplit
,您说这是慢线......它可能会快得多对于csv。
您可以通过以下方式替换以上所有代码:
results = csvread(inputfile);
答案 1 :(得分:1)
我认为通过不同的方式调用文本可以改善很多。
你这样做:
g = textscan(fid,'%s','delimiter','\r\n');
但是然后调用tdata = g {1};
如果正确调用textscan,它应该已经拆分了所有数据,并将其作为数字返回。
试试这个:
g=textscan(fid,'%f,%f,%f,'delimiter','\r\n')
它应该返回三个单元格数组,列中包含您的值。要转换为矩阵,您可以使用:
g=cell2mat(g)
我在0.12秒内输入了200k行。
您的代码似乎还有其他一些解决方法。你从r = 4开始,你似乎有3行你不想读。所以在fopen之后你可以打3次
[~] =fgetl(fid)
访问文件的有趣部分。
您还首先将该行与&#39;,&#39;分开。作为分隔符。但是替换所有&#39;,&#39;通过&#39;。&#39;。这不会做任何事情,所有&#39;,&#39;因为它们被用作分隔符而已经消失了。