2

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

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

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

有人对这种方法有优点/缺点吗?

是否有一个开源产品可以提供像这样的某种 List impl?

谢谢!

更新:

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

5 回答 5

6

你真的需要使用列表吗?编写一个 Iterator 的实现(它可能有助于扩展AbstractIterator)来逐步遍历您的数据。然后,您可以通过该迭代器使用这些有用的实用程序。这些都不会导致大量数据被急切地加载到内存中——相反,只有在迭代器前进时才会从源中读取记录。

于 2009-11-04T01:22:41.383 回答
2

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

于 2009-11-04T01:26:24.817 回答
1

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

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

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

于 2009-11-04T01:32:06.200 回答
0

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

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

于 2009-11-04T00:44:40.767 回答
0

我还会质疑为什么您需要将所有数据加载到内存中来处理它。通常,您应该能够在加载时进行处理,然后使用结果。这将使实际数据保持在内存之外。

于 2009-11-04T01:45:43.967 回答