【发布时间】:2014-03-02 11:45:55
【问题描述】:
我正在尝试处理system('./foo') 命令的输出。如果我直接将输出重定向到带有system('./foo > output') 的文件并通过dlmread 将文件读入MATLAB,它工作正常,但我试图避免在硬盘上每次写入一个巨大的ASCII 文件(大约1e7 行)是时候做这个了。
所以我想直接处理输出,将其读入一个巨大的字符串并拆分字符串。它适用于小文件:
[a,b] = system('./foo')
b=strsplit(b);
cellfun(@str2num, bb);
b=cellfun(@str2num, b(1:end),'UniformOutput',0);
b=cell2mat(b);
不幸的是,这已经在strsplit 操作的步骤中消耗了太多内存,以至于 MATLAB 被 OOM 杀手杀死。
我找到了替代方案:
b=textscan(b,'%s','delimiter',' ','multipleDelimsAsOne',1);
但它也消耗了太多的内存。
有人可以帮助我更好地了解如何拆分该数字字符串并将其读入矩阵,或者通常如何避免将命令的输出写入硬盘上的文件?
编辑:(我在这里写,因为在 cmets 中没有足够的空间......) @MZimmerman6 我现在尝试了 dlmread 的一个版本,有和没有预分配以及你的建议以及我理解的: 事实上,循环比 dlmread 慢得多。
clear all
close all
tic
ttags1=dlmread('tmp.txt',' ',1,3);
toc
clear all
tic
[~,result]=system('perl -e ''while(<>){};print$.,"\n"'' tmp.txt');
numLines1=str2double(result);
ttags=zeros(numLines1,1);
ttags=dlmread('tmp.txt',' ',1,3);
toc
clear all
tic
fid = fopen('tmp.txt');
count = 1;
[~,result]=system('perl -e ''while(<>){};print$.,"\n"'' tmp.txt');
numLines1=str2double(result);
temp = cell(numLines1,1);
for i = 1:numLines1
tline = fgetl(fid);
if ischar(tline)
vals = textscan(tline,'%f','delimiter',',');
temp{i} = transpose(vals{1});
end
end
fclose(fid);
temp = cell2mat(temp);
toc
结果是:
Elapsed time is 19.762470 seconds.
Elapsed time is 21.546079 seconds.
Elapsed time is 796.755343 seconds.
谢谢你和最好的问候
我做错了吗?
【问题讨论】:
标签: string matlab large-data