我最近在思考以下场景:假设你有一个庞大的数据库,并且你想在加载它的一部分时执行一些计算。情况可能就是这个数据库的一小部分可能不适合Java的堆内存,这是非常有限的。人们如何解决这些障碍?谷歌如何利用有限的内存空间对太字节数据进行分析?
提前感谢您的回复。
答案 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)您甚至可以使用压缩算法压缩/解压缩内存中的数据。