Java - 解决大于内存限制的问题

时间:2012-06-25 15:47:58

标签: java algorithm

我最近在思考以下场景:假设你有一个庞大的数据库,并且你想在加载它的一部分时执行一些计算。情况可能就是这个数据库的一小部分可能不适合Java的堆内存,这是非常有限的。人们如何解决这些障碍?谷歌如何利用有限的内存空间对太字节数据进行分析?

提前感谢您的回复。

4 个答案:

答案 0 :(得分:11)

简短的回答是,您需要以适合内存的块的形式处理数据,然后将这些分块计算的结果组合成最终答案(可能分为多个阶段)。一个常见的分布式范例是Map Reduce:有关Google原始实现的详细信息,请参阅here,有关开源实现的详细信息,请参阅Hadoop

答案 1 :(得分:1)

我使用带有堆内存的64位JVM,例如直接ByteBuffers和内存映射文件。这样,当堆为1 GB或更少时,您可以拥有虚拟内存的TB。我运行了不同的应用程序,其中JVM的虚拟内存大小比物理内存大10倍,性能略有下降。如果您可以使用快速SSD,那么当您的工作数据集大于主存储器时,这可以帮助您。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

3)以适合内存的小块处理数据

4)使用更智能的数据结构选择,使用更少的内存,如布隆过滤器或尝试,如果适用。

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