我正在嘗試處理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);
但也消耗了太多的記憶。
有人可以幫助我更好地瞭解如何拆分該數字串並將其讀入矩陣或通常如何避免將命令的輸出寫入硬盤上的文件?
編輯:(我在這裏寫作,因爲在評論中沒有足夠的空間...) @ 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.
謝謝&問候
難道我做錯了什麼?
+1。其他方法快速計數線[這裏](http://stackoverflow.com/questions/12176519/is-there-a-way-in-matlab-to-determine-the-number-of-lines-in-a-文件沒有循環)。 ('>){}; print $。,「\ n」''text.txt'){[〜,result] = system('perl -e''){ – horchler
} ;''numLines = str2double(result);'?還是使用文件使其更快或者這只是不跨平臺? – horchler
好的,謝謝你的回答!我確實會檢查我是否可以避免一次加載整個文件。 我只是想知道爲什麼你用單元格數組來讀取數據?如果我知道我想讀取數字,比用零分配空間(numLines,1)好嗎?再次感謝horchler! – Mechanix