String 按分隔符拆分大字符串
我正在尝试处理String 按分隔符拆分大字符串,string,matlab,large-data,String,Matlab,Large Data,我正在尝试处理系统('./foo')命令的输出。如果我直接将输出重定向到一个带有system('./foo>output')的文件,并通过dlmread将该文件读取到MATLAB中,它可以正常工作,但每次这样做时,我都试图避免在硬盘上写入一个巨大的ASCII文件(大约1e7行) 所以我想直接处理输出,将其读入一个巨大的字符串并拆分字符串。它适用于小文件: [a,b] = system('./foo') b=strsplit(b); cellfun(@str2num, bb); b=cellfun
系统('./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
谢谢你,并致以最良好的问候
我做错什么了吗 您不应该尝试将整个文件读入内存,因为这可能会占用大量内存。我建议逐行读取文件,并分别处理每个文件,然后将结果存储到单元格数组中。然后,一旦解析完成,就可以将其转换为普通矩阵 我可以做的第一件事是创建一个小的Perl脚本来计算您正在读取的文件中的行数,这样您就可以为数据预先分配内存。调用此文件
countlines.pl
。从中收集的信息
Perl-Countlines.pl
while (<>) {};
print $.,"\n";
这应该根据您的文件大小相对快速地运行,并执行您想要的操作。当然,您可以编辑如何在循环内完成解析,但这应该是一个很好的起点
注意:以后,如果不完全需要,请不要尝试将大量内容读入内存。快速计算行数的其他方法。并且不能使用以下方法:
[~,result]=system('perl-e''while(){};print$,“\n”“text.txt”)代码>numLines=str2double(结果)代码>?或者使用文件会让它更快,或者这不是跨平台的吗?好的,谢谢你的回答!我将检查是否可以避免一次加载整个文件。我只是想知道你为什么用细胞阵列来读取数据?如果我知道我想读数字,那么这比用零(numLines,1)分配空间要好吗?再次感谢霍奇勒!我使用单元格数组的唯一原因是,它在预分配空间时更具动态性,而且如果文件包含字符串和数字,单元格数组可以包含多种数据类型,而矩阵则不能@horchler至于一个单独的文件是否能让它更快,我不知道,但我喜欢有这个文件,这样我就可以在多个地方重用代码,只需将这个perl文件放在MATLAB根目录中。只是个人喜好
while (<>) {};
print $.,"\n";
% get number of lines in data file
numLines = str2double(perl('countlines.pl','text.txt'));
fid = fopen('text.txt');
count = 1;
temp = cell(numLines,1);
for i = 1:numLines
tline = fgetl(fid);
if ischar(tline)
vals = textscan(tline,'%f','delimiter',',');
temp{i} = transpose(vals{1});
end
end
fclose(fid);
temp = cell2mat(temp);