我们有一个应用程序的一部分,例如,它需要读取超过内存限制的巨大数据量的20%的时间。虽然我们可以增加内存限制,但我们不愿意这样做,因为它需要在大多数情况下都没有必要进行高分配。
当我们达到这样的峰值负载时,我们正在考虑使用自定义的java.util.List实现来假脱机到磁盘,但在较轻的情况下将保留在内存中。
数据一次加载到集合中,随后迭代并处理,然后丢弃。它不需要在集合中进行排序。
有没有人对这种方法有利弊?
是否有开源产品提供某种类型的List impl?
谢谢!
更新
答案 0 :(得分:6)
你真的需要使用List吗?编写迭代器的实现(可能有助于扩展AbstractIterator),而不是逐步执行数据。然后,您可以使用有用的实用程序like these和该迭代器。这些都不会导致大量数据被急切地加载到内存中 - 相反,只有当迭代器被提前时,才会从源中读取记录。
答案 1 :(得分:2)
如果您正在处理大量数据,则可能需要考虑使用数据库。
答案 2 :(得分:1)
将其备份到数据库并对项目进行延迟加载。
ORM框架可能是有序的。这取决于您的使用情况。这可能是相当直接的,或者是你最糟糕的噩梦很难从你所描述的内容中分辨出来。
我很乐观,我认为使用ORM框架(例如Hibernate)可以在大约3-5天内解决您的问题
答案 3 :(得分:0)
在将数据读入集合时是否正在进行排序/处理?从哪里读取?
如果它已经从磁盘读取,是否可以直接从磁盘批量处理它,而不是完全将其读入列表然后迭代?数据如何相互依赖?
答案 4 :(得分:0)
我还会质疑你为什么需要加载内存中的所有数据来处理它。通常,您应该能够在加载时进行处理,然后使用结果。这样可以使实际数据不受内存限制。