2012-08-17 56 views
4

我試圖用dlmread讀取大文件,但它只是將整個文件視爲一個長列。該文件是用Java編寫下面的代碼:dlmread爲大文本文件返回單列

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 

總共有200萬個數據,有高達60000每行(但不是每行中的相同數字 - 無關緊要)

當我用較小的數據集(100000數據)嘗試它時,它工作得非常好。我不知道問題出在Java還是MATLAB,所以我真的需要一些幫助,謝謝!

+0

Hmmmm,你能發佈的文件?據我所知,dlmread應該沒有這種格式的問題。 您可以嘗試使用不同的導入功能。我對「importdata」有很多好運。 – lawinslow 2012-08-17 18:23:51

+0

我遇到完全相同的問題。我有2個製表符分隔的文件:一個有4行和800列,另一個有4行和160000列,第一個加載爲4x800矩陣,第二個加載爲640000x1矩陣。如果您事先不知道將要輸出的兩種格式中的哪一種格式,那麼當您嘗試將其重新排列成正確的順序時,會出現各種問題。 – FinalArt2005 2012-08-21 08:49:35

回答

5

默認情況下,dlmread會嘗試從文件中推斷出分隔符,默認情況下它使用空格作爲分隔符。

我能夠複製您描述的問題的唯一方法是指定' '作爲分隔符。你確定你沒有這樣做嗎?

請嘗試進行此更改,看看它是否能解決您的問題。

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

如果不解決您的問題,那麼我懷疑問題是一個事實,即在文本文件中的行有不同的列數的產生。例如,如果你使用dlmread打開包含一個文本文件:

1 2 3 4 
5 

dlmread返回這樣的矩陣:

1 2 3 4 
5 0 0 0 

這種表示,因爲它是使用64個字節(每雙8個字節是浪費* 8雙)存儲40個字節的信息。

可能是由於這些空位置導致文件的矩陣表示太大,因此dlmread正在返回您的矢量,以節省內存。

雖然你可以解決這個問題。如果一次只需要幾行,則可以通過指定rangedlmread來加載文件中的行集合。 注意爲此,您必須知道文件中的最大列數,因爲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]); 

然後你可以通過文件加載感興趣的行中循環,但你可能無法將其全部裝入一個矩陣,由於我前面提到的內存限制。

如果您需要內存中的整個數據集,那麼您應該考慮單獨加載每一行並將它們保存到單元數組中。它需要得到一切加載更多的工作,但你能做到這一點的東西是這樣的:

% 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 
+0

_dlmread正在返回您的矢量,以節省內存._ Matlab 2012a絕對是這樣做的。 – Maurits 2013-07-03 22:09:40

+0

'\ t'爲我做了 – API 2016-02-10 12:41:30