Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 按分隔符拆分大字符串_String_Matlab_Large Data - Fatal编程技术网

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);