首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据太大,无法进行int索引

数据太大,无法进行int索引
EN

Stack Overflow用户
提问于 2014-07-17 18:11:51
回答 3查看 96关注 0票数 2

假设我对大数据(就像生物信息学中的数据)感兴趣,我选择用Java来分析它,使用奇妙的集合地图-- HPC上的精简框架。如何处理比2 31 ^ 1 -项更多的数据集?例如,

代码语言:javascript
复制
final List<Gene> genome = getHugeData();
profit.log(genome.parallelStream().collect(magic);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-17 18:18:31

包装你的数据,所以它包含很多块--一旦你超过2^ 31 -1,你就会有下一个。素描是:

代码语言:javascript
复制
class Wrapper {
  private List<List<Gene>> chunks;
  Gene get(long id) {
    int chunkId = id / Integer.MAX_VALUE;
    int itemId = id % Integer.MAX_VALUE;
    List<Gene> chunk = chunks.get(chunkId);
    return chunk.get(itemId);
  }
}
票数 1
EN

Stack Overflow用户

发布于 2014-07-17 18:37:47

在这种情况下,您有多个问题。你的数据有多大?

最简单的解决方案是使用另一种结构,如LinkedList (仅当您对串行访问感兴趣)或可能具有较高插入成本的HashMap。LinkedList不允许任何随机访问。如果您想要访问第五个元素,您还必须首先访问前面所有的4个元素。

这里有另一个想法:让我们假设每个基因都有一个id数(long)。可以使用索引结构(如B+树),并使用该树对数据进行索引。索引不必存储在磁盘上,它可以保留在内存中。它也没有太多的开销。您可以在网上找到许多它的实现。

另一个解决方案是创建一个容器类,它将包含其他容器类或基因。为了实现这一点,两者都应该实现一个名为“可控制”的接口。这样,吉恩类和容器类都是可包含的。一旦容器达到最大值。大小,它可以插入到另一个容器中,等等。您可以通过这种方式创建多个级别。

如果你对B+树不熟悉,我建议你在网上查找B+树(例如维基百科)。

票数 0
EN

Stack Overflow用户

发布于 2014-07-18 11:34:21

一个拥有2^31个对象的数组将消耗大约17 GB的内存.

你应该把数据存储在数据库中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24810675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档