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 繪製多條曲線 顏色設置有沒有比較簡便的方法 ?

TAG:MATLAB | 大數據 | 大數據分析 |