4

で大きなファイルを読み込もうとしていますがdlmread、ファイル全体が 1 つの長い列として扱われます。このファイルは、次のコードを使用して 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();

}

そして私のMATLABスクリプトは次のようにファイルを読み込みます[DATA] = dlmread('probability_cyclelength.dat');:

>>size(DATA)

ans =
         2000000        1 

合計で 2000000 個のデータがあり、1 行あたり最大 60,000 個です (ただし、各行の数が同じではないため、問題にはなりません)。

より小さなデータセット (100000 データ) で試してみると、まったく問題なく動作します。問題が Java にあるのか MATLAB にあるのかわからないので、本当に助けが必要です。ありがとう!

4

1 に答える 1

6

デフォルトdlmreadでは、ファイルから区切り文字を推測しようとします。デフォルトでは、空白を区切り文字として使用します。

あなたが説明した問題を再現できた唯一の方法は' '、区切り文字として指定することでした。あなたはこれをしていないのですか?

この変更を行ってみて、問題が解決するかどうかを確認してください。

data = dlmread(inFile, '\t');

それでも問題が解決しない場合は、テキスト ファイル内の行の列数が異なることが問題の原因であると思われます。たとえば、以下dlmreadを含むテキスト ファイルを開くために使用するとします。

1 2 3 4
5

dlmread次のような行列を返します。

1 2 3 4
5 0 0 0

この表現は、40 バイトの情報を格納するために 64 バイト (double あたり 8 バイト * 8 double) を使用しているため、無駄です。

これらの空の位置では、ファイルの行列表現が単に大きすぎるため、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]);

次に、対象の行をロードするファイルをループ処理することもできますが、前述のメモリの制約により、それらすべてをマトリックスにロードすることはおそらくできません。

データセット全体をメモリに格納する必要がある場合は、各行を個別に読み込んで cell 配列に保存することを検討してください。すべてをロードするにはもう少し作業が必要ですが、次のような方法でそれを行うことができます。

% 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
于 2012-08-17T18:35:15.887 に答える