假设我进入大数据(如生物信息学),我选择使用HPC上精彩的Collections Map-Reduce框架在Java中进行分析。如何处理超过2 31 ^ 1 -
个项目的数据集?例如,
final List<Gene> genome = getHugeData();
profit.log(genome.parallelStream().collect(magic);
答案 0 :(得分:1)
包裹您的数据,使其包含许多块 - 一旦您超过2 ^ 31 - 1,您就会转到下一个。素描是:
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 :(得分:0)
在这种情况下,您有多个问题。你的数据有多大?
最简单的解决方案是使用另一个结构,例如LinkedList(仅当您对串行访问感兴趣时)或可能具有高插入成本的HashMap。 LinkedList不允许任何随机访问。如果您想访问第5个元素,您还必须先访问所有之前的4个元素。
这是另一个想法: 我们假设每个基因都有一个id号(长)。您可以使用索引结构(如B + -tree)并使用树索引数据。索引不必存储在磁盘上,它可以保留在内存中。它也没有太多开销。您可以在线找到它的许多实现。
另一个解决方案是创建一个包含其他容器类或Genes的容器类。为了实现这两者,应该实现一个称为例如中容纳。这样,Gene和Container这两个类都是Containable(s)。一旦容器达到最大值。大小可以插入另一个容器等等。您可以通过这种方式创建多个级别。
如果您不熟悉B + -tree,我建议您在线查看(例如维基百科)。
答案 2 :(得分:0)
具有2 ^ 31个对象的数组将消耗大约17 GB的内存......
您可以将数据存储到数据库中。