matlab如何很好的處理比較大的數據?
我在用matlab導入數據的時候,一共5萬條記錄的csv文件,如果只有兩個變數共2兆左右時,2秒鐘就成功搞定了,但是如果有1000多個變數時,數據約50兆,一旦運行讀取程序電腦就會死機。而同樣的數據用R語言約10s就搞定了。
修改一下:有點失誤,兩個變數的數據為幾百k,鏈接:http://pan.baidu.com/s/1c1lbLAg 密碼:oz5r ,相應的R語言程序:# 讀取數據trainy &<- read.csv("train_y.csv")trainx &<- read.csv("train_x.csv")
相應的Matlab程序:trainy = csvread("train_y.csv",2,0);另一個數據用程序和導入工具箱都會電腦死機------------------------------------------------------------------------
今天發現一個新函數readtable("train_x.csv");直接搞定了readtable("train_x.csv");
你的數據格式什麼樣的?為什麼兩個變數是2M,1000多個變數才50M?你的讀取程序怎麼寫的?
最好把文件發出來吧,50M上傳網盤應該不麻煩更新:
看了你發的文件,你的train_x.csv中的數據中有帶引號的,csvread應該是不能讀取的,下邊是兩種讀取方法:第一種是比較正常的讀取方法,用textscan讀取:fid = fopen("train_x.csv");
data = textscan(fid,"","delimiter",","",...
"MultipleDelimsAsOne",1,"CollectOutput",1,"HeaderLines",1);
fclose(fid);
data = data{1};
這種方法在答主的測試環境下需要4.0s左右
第二種是比較不正常的讀取方法,是先將所有文本讀入之後刪去第一行表頭,再將後續文本中的逗號和雙引號替換為0,之後用sscanf讀取,再根據換行符個數得出行數用reshape得到最終的數組:str = fileread("train_x.csv");
idx = str==10; % 換行符"
"的ASCII碼為10
str = str(find(idx,1)+1:end); % 移除首行表頭信息
data = reshape(sscanf(char(uint16(str).*uint16(str~=","str~=""")),"%f"),...
[],sum(idx)-1).";
這種方法在答主的測試環境下需要2.1s左右
第二種方法比第一種方法快一些,但是第一種代碼可讀性更好一些使用datastore()讀取
環境:Matlab2015b, Win10x64, i3, 8G, SSD
耗時:7.2s
代碼:clear;clc;
tic
RecName = "train_x.csv"; % 設定文件名稱,支持csv/txt等格式
RecStore = datastore(RecName,"ReadVariableNames",true); % 設定是否讀取變數名
RecStore.Delimiter = ","; % 設定分隔符
RecStore.NumHeaderLines = 1; % 設定首行行數,如果第一行也是數據就生成0
RecStore.ReadSize = "file"; % 設定讀取規模
RecTab = readall(RecStore); % 讀取數據
toc
輸出:
csv這個格式是比較好的,新版支持mapreduce,用起來相當方便。大文件,一般採用分塊的方法讀取,textscan,支持。總體思路就是拆分,計算,合併,其實就是mapreduce,2015b自動可以採用開啟配置好的集群。
循環變矩陣運算。多核並行計算。
推薦閱讀:
※如何用matlab編寫人拔禾苗,禾苗變高的這一系列動作?
※如何算是精通MATLAB?
※運行了一段matlab的代碼(見下圖),但結果讓我百思不得其姐,有哪位大神能給我解答一下嗎?
※大家用matlab的時候,都去哪裡下載程序啊?
※MATLAB 繪製多條曲線 顏色設置有沒有比較簡便的方法 ?