2015-05-05 39 views
0

我有一個matlab表格,其中包含以下列。我們可以稱之爲'參考表': [Security(char),RegionId(int int 1,2,3)] 這張表的高度約爲49,000Matlab:大數據映射char到Int

我有其他包含Security(char)隨機數據點作爲列。讓我們稱這些表的'數據表'。 這些數據表的聚合大小是45Gig。這些表中的每一個都是> 1億行。我需要使用參考表映射regionId並執行以下操作:

[Security(char),RegionId(int 1,2,3),RandomDataPoint (float)]

通常對於這個操作我會使用表連接。不過,由於這些表的大規模,我在這個實現中遇到了實際問題。我的主要問題是內存不足。

一種選擇是將表格分解成部分並加入。不過,考慮到45Gig的總體數據,我懷疑這在時間上會非常昂貴。

有沒有人有任何建議我應該如何解決這個問題。如果它很重要,我需要將區域列添加到我的數據表中,以便我可以將數據寫入文本文件並將它們批量裝載到sql中。

在此先感謝

+0

你確定你想/需要使用MATLAB來完成這類任務嗎?如何使用專用的數據庫服務器,也許使用MATLAB的JDBC接口? –

+0

問題是我收到.mat文件。我能想到的另一件事是創建一個temp數據表和一個temp數據表的臨時sql表 - > join in sql - >然後將它們插入到我想要的表中。不過,我想找一些更美觀的東西。 – user2353644

+2

您可能對mapreduce有興趣:http://www.mathworks.com/help/matlab/examples/process-big-data-in-matlab-using-mapreduce.html。我從來沒有使用它,但似乎適合你的任務 – brodoll

回答

0

我知道它口感不好回答自己的問題,但這裏是我結束了。

經過大量測試後,我發現這是最快的。 我完全消除了加入。

maskfor1 = ismember(data.Securities,reference.Securities(reference.RegionId==1)) 

現在我減少了證券數量,我必須使用maskfor1檢查regionId == 2。然後我重新創建了maskfor2應該是什麼樣子。

maskFor2 = zeros(height(data.Securities),1); 

minitureMaskFor2 = ismemeber(data.Securities(~masfor1),reference.Securities(reference.RegionId==2)) 

maskFor2(~maskfor2) = minitureMaskFor2; 

其餘的是regionId = 3.現在使用掩碼爲表創建regionId列。

這個過程花費大約1分20秒來運行1億行。