我正在尝试用大文件读取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中,所以我真的需要一些帮助,谢谢!
默认情况下,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)
| 归档时间: |
|
| 查看次数: |
2817 次 |
| 最近记录: |