dlmread为大型文本文件返回单个列

asb*_*ans 4 java matlab file

我正在尝试用大文件读取dlmread,但它只是将整个文件视为一个长列.该文件使用Java编写,代码如下:

public void writeToFile(double[] arr) throws IOException{

FileWriter write = new FileWriter(path, append);
PrintWriter print_line = new PrintWriter(write);

for(int i=0; i<arr.length; i++){
  print_line.printf("%f\t", arr[i]);   
}
print_line.printf("\n");

print_line.close();

}
Run Code Online (Sandbox Code Playgroud)

我的MATLAB脚本读入文件,如:[DATA] = dlmread('probability_cyclelength.dat');给:

>>size(DATA)

ans =
         2000000        1 
Run Code Online (Sandbox Code Playgroud)

总共有2000000个数据,每行最多60,000个(但每行中的数字不一样 - 应该无关紧要)

当我尝试使用较小的数据集(100000数据)时,它的工作原理非常好.我不知道问题是在Java还是MATLAB中,所以我真的需要一些帮助,谢谢!

sla*_*ton 6

默认情况下,dlmread尝试从文件中推断分隔符,默认情况下它使用空格作为分隔符.

我能够复制您描述的问题的唯一方法是指定' '为分隔符.你确定你没有这样做吗?

尝试进行此更改,看看它是否能解决您的问题.

data = dlmread(inFile, '\t');
Run Code Online (Sandbox Code Playgroud)

如果这不能解决您的问题,那么我怀疑问题是由于文本文件中的行具有不同的列数而引起的.例如,如果您使用dlmread打开包含以下内容的文本文件:

1 2 3 4
5
Run Code Online (Sandbox Code Playgroud)

dlmread 返回一个这样的矩阵:

1 2 3 4
5 0 0 0
Run Code Online (Sandbox Code Playgroud)

这种表示是浪费的,因为它使用64字节(每双8字节*8双)来存储40字节的信息.

可能是因为对于这些空位置,文件的矩阵表示太大了,所以dlmread返回你的向量而不是节省内存.

你可以解决这个问题.如果您一次只需要几行,则可以通过指定rangeto来从文件中加载一组行dlmread.请注意,要使用此文件,您必须知道文件中的最大列数,因为dlmread这样不会让您读取的列数超过该数量.

r = [0 4]; %load the first 5 rows
maxC = 10; % load up to 10 columns
data = dlmread(inFile, '\t', [r(1), 0, r(2), maxX]);
Run Code Online (Sandbox Code Playgroud)

然后你可以遍历文件加载感兴趣的行,但由于我之前提到的内存限制,你可能无法将它们全部加载到矩阵中.

如果您需要内存中的整个数据集,那么您应该考虑单独加载每一行并将它们保存到单元格数组中.让所有东西都加载需要更多的工作,但你可以这样做:

% open the file
fid = fopen(fileName); 
% load each line as a single string
tmp = textscan(fid, '%s', 'delimiter', '\n'); 
% textscan wraps its results in a cell, remove that wrapping
rawText = tmp{1}; 
nLines = numel(rawText);

%create a cell array to store the processed string
data = cell(nLines, 1);
for i = 1:nLines
  %scan a line of text returning a vector of doubles
  tmp = textscan(rawText{i}, '%f');
  data{i} = tmp{1}; 
end
Run Code Online (Sandbox Code Playgroud)