2013-02-08 102 views
0

處理我有一個大的文本文件,幾乎150 MB到500 MB,該文件包含20條LACS線...文件文件在MATLAB

內容是這樣的....

USDINR12AUGFUT   1 1343791803 579782 2012-08-01 09:00:03 BID   55.5725  200 
USDINR12AUGFUT   2 1343791803 594246 2012-08-01 09:00:03 BID   55.9650  150 
USDINR12AUGFUT   3 1343791803 594570 2012-08-01 09:00:03 ASK   56.0700  100 
USDINR12AUGFUT   4 1343791803 946831 2012-08-01 09:00:03 ASK   56.0450  500 
USDINR12AUGFUT   5 1343791804 16514 2012-08-01 09:00:04 TRADE  55.9650   5 55965.00   5 
USDINR12AUGFUT   6 1343791804 19401 2012-08-01 09:00:04 BID   55.9800  14 
USDINR12AUGFUT   7 1343791804 32311 2012-08-01 09:00:04 BID   56.0000  100 
USDINR12AUGFUT   8 1343791804 33292 2012-08-01 09:00:04 ASK   56.0400  150 
USDINR12AUGFUT   9 1343791804 34695 2012-08-01 09:00:04 TRADE  56.0000   1 55970.83   6 
USDINR12AUGFUT   10 1343791804 35599 2012-08-01 09:00:04 TRADE  56.0000   1 55975.00   7 
USDINR12AUGFUT   11 1343791804 36626 2012-08-01 09:00:04 TRADE  56.0000   1 55978.12   8 
USDINR12AUGFUT   12 1343791804 53676 2012-08-01 09:00:04 TRADE  56.0000  60 55997.43  68 
USDINR12AUGFUT   13 1343791804 57434 2012-08-01 09:00:04 TRADE  56.0000  25 55998.12  93 
USDINR12AUGFUT   14 1343791804 57967 2012-08-01 09:00:04 TRADE  56.0000   1 55998.14  94 
USDINR12AUGFUT   15 1343791804 60474 2012-08-01 09:00:04 TRADE  56.0000   1 55998.16  95 
USDINR12AUGFUT   16 1343791804 60988 2012-08-01 09:00:04 TRADE  56.0000   1 55998.18  96 
USDINR12AUGFUT   17 1343791804 61232 2012-08-01 09:00:04 TRADE  56.0000   1 55998.20  97 
USDINR12AUGFUT   18 1343791804 61974 2012-08-01 09:00:04 TRADE  56.0000   1 55998.21  98 
USDINR12AUGFUT   19 1343791804 62449 2012-08-01 09:00:04 TRADE  56.0000   1 55998.23  99 

我的問題是我想對MATLAB使用這個文件做一些測試,所以我必須導入這個文件。但每當我使用fopentextscan MATLAB拋出一個錯誤說...

??? Error using ==> textscan 
Out of memory. Type HELP MEMORY for your options. 

但是當我使用20-50 MB的文件運行良好。

如何克服這一點?幫我...


我的代碼:

% file_path = 'E:\volume\august\AUG03.MCX'; 
file_path = 'D:\home\flexsys\pavan\usdinr_t\USDINR12AUGFUT.MCX'; 

fid = fopen(file_path); 

C = textscan(fid,'%s %d %d %d %s %s %s %f %d %f %d'); 
n = length(C{1}); 

for i = 1 : n 
    raw_data.symbol(i)  = C{1}(i); 
    raw_data.trade_no(i) = C{2}(i); 
    raw_data.utc_sec(i)  = C{3}(i); 
    raw_data.utc_nano(i) = C{4}(i); 
    raw_data.date(i)  = C{5}(i); 
    raw_data.time(i)  = C{6}(i); 
    raw_data.trade_type(i) = C{7}(i); 
    raw_data.ltp(i)   = C{8}(i); 
    raw_data.ltq(i)   = C{9}(i); 
    raw_data.vwap(i)  = C{10}(i); 
    raw_data.volume(i)  = C{11}(i); 

    % % % some back testing here. 

end 

我已經存儲的所有數據C變量,那還有錯誤

+0

你需要一次所有的數據嗎?如果不是,並且數據太大以至於無法放入內存中,則可以通過行讀取它,並且每次一個一個地處理。 – Amro 2013-02-08 12:53:01

+0

我正在做的是我正在讀取一個變量中的所有數據,然後我找到平均值基於ltp的60個值等等....所以我怎樣才能處理這一行一行...在一些函數中,我需要大約200行中的60行數據等...因爲我只採用TRADE來自文件的行。 – user2010340 2013-02-08 13:06:54

+0

textscan確實支持指定應用格式字符串的次數的'N'參數:'textscan(fid,frmt,60)'。下一次它被叫,它繼續它停止的地方。 – Amro 2013-02-08 13:20:13

回答

0

當內存不足時,您必須執行一些操作才能使用較少的內存。在這裏的其他答案中有一些很好的想法,但是如果這些失敗了,唯一剩下的就是以適合內存的塊來讀取和處理文件。

一種選擇是撥打textscan,並使用參數N指定讀取指定的format的次數。將該調用放入一個循環中,並且每次都會讀取一個文件塊。類似這樣的:

while ~feof(fid) 
    C = textscan(fid, 'format', N); 
end 
0

如果指定的行或數量用textscan重複格式編號,MATLAB計算預先需要的確切的內存量。

http://www.mathworks.co.uk/help/matlab/matlab_prog/strategies-for-efficient-use-of-memory.html

+0

%file_path = 'E:\卷\八月\ AUG03.MCX'; file_path ='D:\ home \ flexsys \ pavan \ usdinr_t \ USDINR12AUGFUT。MCX「; block_size = 1000; format ='%s%d%d%d%s%s%s%f%d%f%d'; fid = fopen(file_path); (fid) 雖然〜feof(fid) C = textscan(fid,format,bolck_size); end ....問題是,這段代碼只取最後一個block_size行......我不理解它應該先取或後取 – user2010340 2013-02-08 13:13:56

1

不知道是否在這裏工作,但關於使用更高級別的命令,在數據讀取怎麼樣?

鑑於您的數據結構,我會查看csvread,xlsreaddlmread

你也可以右鍵點擊當它在當前文件夾中並點擊import

+0

實際上,文件中的行幾乎會產生10到20行的問題。 ..你不能導入使用csvread xlsread ...我試過所有...我必須檢查dlmread .... – user2010340 2013-02-08 13:11:48