哪种语言用于非常大的数据集和涉及的大量计算

时间:2009-08-17 15:31:15

标签: mysql language-agnostic

问题的一般概念是数据安排在表格的以下三列中

"Entity" "parent entity" "value"
A001        B001        .10
A001        B002        .15
A001        B003        .2
A001        B004        .3
A002        B002        .34
A002        B003        .13
..
..
..
A002        B111        .56

有实体图和值可以看作从父实体到实体的有向边的权重。我必须计算特定实体的父实体的多少个不同子集大于.5(比如说)。进一步计算某些东西(后面的部分很容易,而不是复杂的计算)

重点是数据量巨大(Excel文件说数据丢失:()。我可以使用哪种语言或工具?有些人建议我使用SAS或STATA。

提前致谢

11 个答案:

答案 0 :(得分:4)

您可以在SQL中执行此操作。桌面的两个选项(无需安装某种SQL服务器)是MS Access或OpenOffice数据库。两者都可以将CSV文件读入数据库。

在那里,您可以运行SQL查询。语法有点奇怪,但这应该让你开始:

select ParentEntity, sum(Value)
from Data
where sum(Value) > .5
group by ParentEntity

Data是您加载数据的表的名称,EntityValueData表中列的名称。

答案 1 :(得分:3)

如果您正在考虑SAS,可以查看R,这是一种用于数据挖掘的免费语言/环境。

答案 2 :(得分:2)

我猜你所引用的表实际上是在一个文件中,并且该文件对于Excel来说太大了。我建议你使用一种你熟悉的语言。在您知道的那些中,选择具有以下特征的那个:

- 能够逐行读取文件;

- 支持您要在内存中使用的类型的数据结构;

- 有很好的数学设施。

答案 3 :(得分:1)

SAS是一种出色的语言,用于快速处理大型数据集(数亿条记录,其中每条记录包含数百个变量)。它被用于学术界和许多行业(我们将其用于保修索赔分析;许多临床试验将其用于统计分析和报告)。

但是,有一些警告:我认为该语言存在一些缺陷,这使得编写模块化,可重用的代码变得很困难(有一个非常丰富的宏工具,但在版本9.2之前没有用户定义的函数)。可能更大的警告是SAS许可证非常昂贵;因此,对于单个人来说,为自己的实验购买许可证可能是不切实际的,尽管许可证的价格可能不会对大公司产生影响。不过,我相信SAS推出的学习版本可能更便宜。

如果您对学习SAS感兴趣,可以参考以下资源:

还有区域和本地SAS用户组,您可以从中学到很多东西(例如在我的区域有MWSUG(中西部SAS用户组)和MISUG(密歇根SAS用户组))。

答案 4 :(得分:1)

如果您不介意真正使用某种语言并使用某些特定于操作系统的调用,那么使用内存映射文件的C非常快。

您首先需要编写一个转换器,将您拥有的文本数据转换为内存映射文件,然后再编写第二个将文件映射到内存并扫描数据的程序。

答案 5 :(得分:1)

我讨厌这样做,但我会简单地推荐C.你需要的是用数学语言弄清楚你的问题,然后把它实现到C中。在内存中存储图形的方法是一项大型研究区域。如果图形密集(高度连接),则可以使用邻接矩阵;如果不是,则可以使用邻接列表。每个子树搜索都是一些奇特的代码,这可能是一个难题。

正如其他人所说,SQL可以做到,代码甚至已经发布。如果您需要帮助将文本文件中的数据放入SQL数据库,那就是另一个问题。查找批量数据插入。

SQL的问题在于,即使它是一种非常简洁的语言,它也会被数据库引擎解析,而底层代码可能不是最好的方法。对于大多数数据访问例程,SQL数据库引擎将产生一些惊人的代码效率,但对于图形和非常大的计算,我不相信它。这就是你去C的原因。一些让你自己动手的低级语言将是最有效的。

我认为由于大量数据,您需要高效的代码。

所有这些都假设数据集适合内存。如果你的图形比工作站的ram大,(如果可以的话,得到一个24GB的图形),那么你应该找到一种方法来对数据进行分区以使其适合。

答案 6 :(得分:1)

Mathematica在我的经历中相当不错......

答案 7 :(得分:0)

Perl是一个很好的起点,它在处理文件输入和字符串解析方面非常有效。然后,您可以将整个集合保存在内存中或仅保留子集。

答案 8 :(得分:0)

SQL是一个不错的选择。数据库服务器旨在管理大量数据,并经过优化,可以有效地使用机器上的每个可用资源来提高性能。

值得注意的是,Oracle 10针对多处理器计算机进行了优化,如果可能,会自动在处理器之间拆分请求(使用正确的配置,在您最喜欢的搜索引擎上搜索“oracle请求并行化”)。

如果您在一个拥有良好数据库服务器的大型组织中,此解决方案特别有效。

答案 9 :(得分:0)

  

至少简单的SQL语句不会   工作(请仔细阅读问题)i   需要找到所有子集的总和   检查集合中元素的总和   .5与否。谢谢 - 8月18日   7:36

由于您的数据位于Stata中,因此以下代码可以在Stata中执行您所要求的操作(将此代码粘贴到您的操作文件编辑器中):

//input the data
clear
input str10 entity str10 parent_entity value
A001 B001 .10
A001 B002 .15
A001 B003 .2
A001 B004 .3
A002 B002 .34
A002 B003 .13
A002 B111 .56
end

//create a var. for sum of all subsets
bysort entity : egen sum_subset = total(value)

//flag the sets that sum > .5
bysort entity : gen indicator = 1 if sum_subset>.5
recode ind (.=0)
lab def yn 1 "YES", modify
lab def yn 0 "No", modify
lab val indicator yn
li *, clean

请记住,使用Stata时,您的数据会保留在内存中,因此您仅受系统内存资源的限制。如果您尝试打开.dta文件&它说'op。 sys拒绝提供mem',然后你需要尝试使用命令-set mem-来增加内存来运行数据。

最终, StefanWoe的问题:

  你给我们一个关于如何巨大的想法   数据集是?百万?数十亿   记录?还有一个重要的问题:   你只需要这样做一次吗?要么   未来的每一天?或数百   每小时一次? - StefanWoe 8月18日   在13:15

这真的推动了您的问题,而不是使用哪种软件......使用Stata进行自动化,即使是在大量数据上,也不会很困难,但您可以快速实现资源限制。

答案 10 :(得分:0)

我会使用Java的BigInteger库和一些功能性的东西,比如说Hadoop。