2015-05-05 38 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亿行。