【发布时间】:2017-04-25 13:32:20
【问题描述】:
我有一个包含三列的非常简单的 csv 文件。现在我想尽快将这些列加载到 matlab 矩阵中。
目前我做的是这个
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
然而,对于 200 000 行,这需要大约 30 秒。这意味着每行 150 µs。这真的很慢。 parfor 不接受该代码。
现在我想知道是什么导致了 for 循环中的瓶颈以及如何加快它的速度。
这里测量的时间:
str2double 578253 调用 29.631s
strsplit 192750 调用 13.388s
编辑: 内容在文件中有这样的结构
0.000000, -0.00271, 5394147
0.000667, -0.00271, 5394148
0.001333, -0.00271, 5394149
0.002000, -0.00271, 5394150
【问题讨论】:
-
你看过
code profiling吗?您还可以使用 GUI 中的“运行和时间”选项来确定慢步。 -
我将结果添加到帖子中
标签: matlab performance for-loop