最近我在思考以下情景:假设你有一个巨大的数据库,想要在加载其中一部分时执行一些计算。即使只是其中的一小部分,也可能无法适应Java的堆内存,因为它非常有限。人们如何解决这些障碍?Google如何在有限的内存空间中对数千兆字节的数据进行分析?
感谢您提前的回复。
我使用64位JVM,配合直接ByteBuffer和内存映射文件等离线内存。这样,您可以拥有TB级别的虚拟内存,而堆大小只有1 GB或更少。我运行过不同的应用程序,在其中JVM的虚拟内存大小比物理内存大10倍,性能损失较小。如果您可以使用快速SSD,当您的工作数据集大于主内存时,这将对您有所帮助。
你要么需要获取更多的内存并增加堆大小,或者如果这不可行,编写一个算法,每次只加载数据的子集。
1)增加您的物理内存和/或虚拟内存大小。
2)使用具有分片或类似技术的多台计算机。
3)将数据分成更小的块,以适应内存。
4)如果合适,使用更智能的数据结构选择来减少内存使用量,例如布隆过滤器或Trie树。
5)甚至可以使用压缩算法在内存中压缩/解压缩数据。