我们有一个应用程序的一部分,比如说,20%的时间需要读取超过内存限制的大量数据。虽然我们可以增加内存限制,但我们对此犹豫不决,因为它需要有一个高分配,而大多数时候它是不必要的。
我们正在考虑使用一个定制的java.util.list实现,当我们遇到这样的峰值负载时,它将假脱机到磁盘,但在较轻的情况下,它将保留在内存中。
将数据加载到集合中一次,然后进行迭代和处理,然后丢弃。它一进收藏就不需要分类了。
有人对这种方法有赞成/反对意见吗?
有没有一个开源产品提供了类似这样的列表impl?
谢谢!
更新:
不厚颜无耻,但我所说的“巨大”是指超出我们愿意分配的内存量,而不干扰同一硬件上的其他进程。你还需要什么细节?
应用程序本质上是一个批处理程序,它从多个数据库表加载数据,并在其上执行广泛的业务逻辑。列表中的所有数据都是必需的,因为聚合操作是完成的逻辑的一部分。
我刚刚看到这篇文章,它提供了一个非常好的选择:java中的stxxl等价物
5条答案
按热度按时间inn6fuwd1#
我还想问为什么需要加载内存中的所有数据来处理它。通常,您应该能够在加载时进行处理,然后使用结果。这将使实际数据不在内存中。
btxsgosb2#
将其备份到数据库并对项目进行延迟加载。
一个orm框架可能是合适的。这取决于你的用法。这可能是很直截了当的,或者你最糟糕的噩梦很难从你所描述的中分辨出来。
我是乐观主义者,我认为使用orm框架(比如hibernate)可以在3-5天内解决问题
ffscu2ro3#
如果您处理的是大量数据,您可能需要考虑改用数据库。
k2fxgqgv4#
你真的需要使用列表吗?编写一个迭代器的实现(它可能有助于扩展abstractiterator),逐步遍历您的数据。然后,您可以利用这些有用的实用工具与迭代器。所有这些都不会导致大量数据被急切地加载到内存中——相反,只有在迭代器升级时,才会从源代码中读取记录。
jqjz2hbq5#
在将数据读入集合时是否正在进行排序/处理?它是从哪里读来的?
如果它已经从磁盘读取了,是否可以直接从磁盘批处理它,而不是将它完全读取到一个列表中然后进行迭代?数据的相互依赖程度如何?