我是物理专业的研究生,我正在编写一些代码来分类几百千兆字节的数据,并在我要求时返回那些数据.这是诀窍,我知道没有很好的方法来排序和搜索这种数据.
我的数据基本上由大量数字组成.这些集合中可以包含1到n个数字(尽管在99.9%的集合中,n小于15),并且这些集合大约有1.5到20亿(不幸的是,这个大小排除了强力搜索).
我需要能够指定一个具有k个元素的集合,并且每个集合都包含k + 1个或更多元素,其中包含返回给我的指定子集.
简单示例:
假设我的数据有以下几组:
(1,2,3)
(1,2,3,4,5)
(4,5,6,7)
(1,3,8,9)
( 5,8,11)
如果我要提出请求(1,3),我会得到集合:(1,2,3),(1,2,3,4,5)和(1,3,8,9).
请求(11)将返回集合:(5,8,11).
请求(1,2,3)将返回集:(1,2,3)和(1,2,3,4,5)
请求(50)将不返回任何集:
到现在为止,模式应该清晰.这个例子和我的数据之间的主要区别在于,没有我的数据的集合更大,用于集合的每个元素的数字从0到16383(14位)运行,并且还有许多集合.
如果它很重要我用C++编写这个程序虽然我也知道java,c,一些程序集,一些fortran和一些perl.
有没有人有任何关于如何解决这个问题的线索?
编辑:
回答几个问题并添加几点:
1.)数据不会改变.这一切都是在一长串运行中进行的(每个运行分为2个gig文件).
2.)至于存储空间.原始数据占用大约250千兆字节.我估计在处理和剥离了许多我不感兴趣的无关元数据后,我可以将其降低到36到48千兆字节,具体取决于我决定保留多少元数据(没有索引).另外,如果在我初始处理数据时遇到了相同的设置,我可能会通过添加重复事件的计数器来进一步压缩数据,而不是简单地一遍又一遍地重复事件.
3.)处理集内的每个数字实际上包含至少两个数字14位用于数据本身(检测到的能量)和7位用于元数据(检测器编号).所以我需要每个数字至少三个字节.
4.)我的"虽然在99.9%的集合中,n小于15"但评论具有误导性.在初步浏览一些数据块时,我发现我有多达22个数字的集合,但中位数是每组5个数字,平均值是每组6个数字.
5.)虽然我喜欢构建指向文件的索引的想法,但我有点怀疑,因为对于涉及多个数字的请求,我留下了半慢的任务(至少我认为它很慢)找到集合列表共有的所有指针,即找到给定数量的集合的最大公共子集.
6.)就我可用的资源而言,在我获得系统上的原始数据(我在该系统上的配额的剩余部分)后,我可以获得大约300个空间.该系统是一个双处理器服务器,具有2个四核amd和16 GB的内存.
7.)是0可以发生,它是数据采集系统的工件,但它可以发生.
您的问题与搜索引擎所面临的问题相同."我有很多文件.我需要那些包含这组文字的文件." 你只是(非常方便),整数而不是单词和小文件.解决方案是倒排索引.Manning等人的信息检索简介(在该链接上)可在线免费获取,非常易读,并将详细介绍如何执行此操作.
您将不得不为磁盘空间付出代价,但它可以并行化,并且应该足够快,以便在构建索引后满足您的时序要求.