假设我对大数据(就像生物信息学中的数据)感兴趣,我选择用Java来分析它,使用奇妙的集合地图-- HPC上的精简框架。如何处理比2 31 ^ 1 -项更多的数据集?例如,
final List<Gene> genome = getHugeData();
profit.log(genome.parallelStream().collect(magic);发布于 2014-07-17 18:18:31
包装你的数据,所以它包含很多块--一旦你超过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);
}
}发布于 2014-07-17 18:37:47
在这种情况下,您有多个问题。你的数据有多大?
最简单的解决方案是使用另一种结构,如LinkedList (仅当您对串行访问感兴趣)或可能具有较高插入成本的HashMap。LinkedList不允许任何随机访问。如果您想要访问第五个元素,您还必须首先访问前面所有的4个元素。
这里有另一个想法:让我们假设每个基因都有一个id数(long)。可以使用索引结构(如B+树),并使用该树对数据进行索引。索引不必存储在磁盘上,它可以保留在内存中。它也没有太多的开销。您可以在网上找到许多它的实现。
另一个解决方案是创建一个容器类,它将包含其他容器类或基因。为了实现这一点,两者都应该实现一个名为“可控制”的接口。这样,吉恩类和容器类都是可包含的。一旦容器达到最大值。大小,它可以插入到另一个容器中,等等。您可以通过这种方式创建多个级别。
如果你对B+树不熟悉,我建议你在网上查找B+树(例如维基百科)。
发布于 2014-07-18 11:34:21
一个拥有2^31个对象的数组将消耗大约17 GB的内存.
你应该把数据存储在数据库中。
https://stackoverflow.com/questions/24810675
复制相似问题