Java - 解决超出内存限制的问题

3

最近我在思考以下情景:假设你有一个巨大的数据库,想要在加载其中一部分时执行一些计算。即使只是其中的一小部分,也可能无法适应Java的堆内存,因为它非常有限。人们如何解决这些障碍?Google如何在有限的内存空间中对数千兆字节的数据进行分析?

感谢您提前的回复。


3
谷歌正在采用大规模并行处理来管理其数据。详情请参见MapReduce - Sirko
4个回答

11

简短回答是你需要将数据分成适合内存的块进行处理,然后将这些块计算的结果组合成最终的答案(可能需要多个步骤)。这种处理方式通常使用Map Reduce分布式范式来实现:参见此处获取Google原始实现的详细信息,以及Hadoop获取开源实现。


Hadoop 的下限是几百GB,否则可能会过度杀伤。 - Deniz
@Deniz:绝对没错。如果数据大小只是内存大小的几倍,那么可以使用自己的代码在单台机器上处理这些块,而不需要使用重量级框架。 - Alex Wilson

1

我使用64位JVM,配合直接ByteBuffer和内存映射文件等离线内存。这样,您可以拥有TB级别的虚拟内存,而堆大小只有1 GB或更少。我运行过不同的应用程序,在其中JVM的虚拟内存大小比物理内存大10倍,性能损失较小。如果您可以使用快速SSD,当您的工作数据集大于主内存时,这将对您有所帮助。


0

你要么需要获取更多的内存并增加堆大小,或者如果这不可行,编写一个算法,每次只加载数据的子集。


0

1)增加您的物理内存和/或虚拟内存大小。

2)使用具有分片或类似技术的多台计算机。

3)将数据分成更小的块,以适应内存。

4)如果合适,使用更智能的数据结构选择来减少内存使用量,例如布隆过滤器或Trie树。

5)甚至可以使用压缩算法在内存中压缩/解压缩数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接