如何处理大型数据列表

时间:2009-11-04 00:39:45

标签: java algorithm collections list large-data-volumes

我们有一个应用程序的一部分,例如,它需要读取超过内存限制的巨大数据量的20%的时间。虽然我们可以增加内存限制,但我们不愿意这样做,因为它需要在大多数情况下都没有必要进行高分配。

当我们达到这样的峰值负载时,我们正在考虑使用自定义的java.util.List实现来假脱机到磁盘,但在较轻的情况下将保留在内存中。

数据一次加载到集合中,随后迭代并处理,然后丢弃。它不需要在集合中进行排序。

有没有人对这种方法有利弊?

是否有开源产品提供某种类型的List impl?

谢谢!

更新

  • 不要厚颜无耻,但是'巨大'是指超出我们愿意分配的内存量,而不会干扰同一硬件上的其他进程。你需要什么其他细节?
  • 应用程序本质上是一个批处理器,它从多个数据库表中加载数据并在其上执行广泛的业务逻辑。列表中的所有数据都是必需的,因为聚合操作是完成逻辑的一部分。
  • 我刚刚看到这篇帖子提供了一个非常好的选择:STXXL equivalent in Java

5 个答案:

答案 0 :(得分:6)

你真的需要使用List吗?编写迭代器的实现(可能有助于扩展AbstractIterator),而不是逐步执行数据。然后,您可以使用有用的实用程序like these和该迭代器。这些都不会导致大量数据被急切地加载到内存中 - 相反,只有当迭代器被提前时,才会从源中读取记录。

答案 1 :(得分:2)

如果您正在处理大量数据,则可能需要考虑使用数据库。

答案 2 :(得分:1)

将其备份到数据库并对项目进行延迟加载。

ORM框架可能是有序的。这取决于您的使用情况。这可能是相当直接的,或者是你最糟糕的噩梦很难从你所描述的内容中分辨出来。

我很乐观,我认为使用ORM框架(例如Hibernate)可以在大约3-5天内解决您的问题

答案 3 :(得分:0)

在将数据读入集合时是否正在进行排序/处理?从哪里读取?

如果它已经从磁盘读取,是否可以直接从磁盘批量处理它,而不是完全将其读入列表然后迭代?数据如何相互依赖?

答案 4 :(得分:0)

我还会质疑你为什么需要加载内存中的所有数据来处理它。通常,您应该能够在加载时进行处理,然后使用结果。这样可以使实际数据不受内存限制。