问题的一般概念是数据安排在表格的以下三列中
"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。
提前致谢
答案 0 :(得分:4)
您可以在SQL中执行此操作。桌面的两个选项(无需安装某种SQL服务器)是MS Access或OpenOffice数据库。两者都可以将CSV文件读入数据库。
在那里,您可以运行SQL查询。语法有点奇怪,但这应该让你开始:
select ParentEntity, sum(Value)
from Data
where sum(Value) > .5
group by ParentEntity
Data
是您加载数据的表的名称,Entity
和Value
是Data
表中列的名称。
答案 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。