2011-12-27 41 views
3

我正在将XML文档读取到HashMaps,ArrayLists中,以便即使在内存中保持关系。我的代码做我的工作,但我担心我在这个庞大的地图和列表上执行的迭代或函数调用。目前我工作的xml数据并不是那么庞大。但我不知道会发生什么。我需要在使用这些hashmaps的逻辑上执行哪些测试用例?使用Java集合来处理如此庞大的数据有多糟糕?他们有没有其他选择?巨大的数据会影响JVM崩溃吗?使用海量数据时使用Hashmaps和ArrayLists有多糟?

+0

我建议你尝试生成大的和巨大的XML数据文件,看看会发生什么。当你知道它可以处理多大时,尝试使用探查器来查看如何使它更有效。 – 2011-12-27 10:43:04

回答

2

JVM不会在您描述的内容中崩溃。可能发生的是OutOfMemoryError。同样,如果您长期保留这些集合中的数据,您可能会遇到垃圾收集问题。你真的需要将整个XML数据存储在内存中吗?

0

我需要在使用这些hashmaps的逻辑上执行哪些测试用例?

为什么不生成大的XML文件(例如,比当前数据示例大5倍)并检查解析器/内存存储?因为只有你知道你的情况下可能有哪些文件,它们会以多快的速度增长,这是唯一的解决方案。

如何使用Java集合坏了如此巨大的数据?他们有没有 替代品?巨大的数据会影响JVM崩溃吗?

当然,如果您尝试将过多的数据存储在内存中,并且不符合GC条件,您是否可能会发生OutOfMemory异常。这个库:http://trove.starlight-systems.com/声明,它使用较少的内存,但我没有使用它自己。一些讨论,请访问:What is the most efficient Java Collections library?

1

如果你正在处理临时数据,你需要有一台快速访问你没有很多的选择。问题是当你说“巨大”时你的意思是什么?兆字节?千兆字节? TB的?

虽然您的数据不超过1G恕我直言,恕我直言,它在内存中可能会确定。否则,你应该考虑一下像DB的替代品(关系或的NoSql)文件等

在你的具体的例子我想更换的ArrayList到LinkedList的,除非你需要随机访问列表。 ArrayList只是一个数组的封装,所以当你需要100万个元素时,它会分配100万个元素长的数组。当元素数量很大时,链接列表更好,但是按索引访问元素的速率是o(n/2)。如果您需要两者(即巨大的列表和快速访问),请使用TreeMap,并将索引作为关键字。您将获得日志(n)访问率。

+0

嗯。不好的建议。使用当前的硬件,限制应该是大约半太字节(数据和包含结构)。这就是适合价格合理的工作站。 – 2012-11-16 14:17:09

11

Java集合有一定的开销,这可以提高存储器使用了很多(在极端的情况下的20倍)时,他们的应用程序的主要数据结构和有效载荷数据包括大量的小物件的。即使实际数据比可用内存小得多,这也可能导致应用程序终止于OutOfMemoryError

  • ArrayList实际上是对大量元素的效率很高,但效率不高,当你有大量是空的或只包含一个元素列表。对于这些情况,您可以使用Collections.emptyList()Collections.singletonList()来提高效率。
  • HashMap具有相同的问题以及存储在其中的每个元素的相当大的开销。所以同样的建议适用于ArrayList。如果您有大量元素,则可能会有更高效的其他Map实现,例如, Google Guava
  • 当您将原始值(如intlong)存储在集合中时发生最大开销,因为需要将其作为对象进行打包。在这些情况下,GNU Trove集合提供了一个替代方案。
  • 针对您的情况,具体而言,问题是您是否真的需要将XML中的全部数据一次保存在内存中,或者您是否可以小块处理它。如果您的数据可以随意增大,这可能是最好的解决方案。
  • 最简单的短期解决方案是简单地购买更多的内存。它很便宜。
+1

对于一个非常普遍的问题,一个非常彻底的答案。竖起大拇指。 – cherouvim 2011-12-27 09:11:14

0

如何使用Java集合来处理如此庞大的数据?

爪哇Map实现和(在较小程度上)Collection实现都趋向于使用的存储器相当数量。当键/值/元素类型是原始类型的包装类型时,效果最为明显。

是否有替代方案?

还有一些使用较少内存的原始类型“集合”的替代实现;例如GNU Trove库。但是他们没有实现标准的Java收集API,这严重限制了它们的实用性。

如果您的集合不使用原始包装类,那么您的选项更受限制。您可能能够实现自己的自定义数据结构以使用更少的内存,但保存不会太好(按百分比计算),并且您需要执行大量工作来实现代码。

更好的解决方案是重新设计您的应用程序,使其不需要需要来表示内存中的整个XML数据结构。 (如果你能达到这个目的)

巨大的数据会影响JVM崩溃吗?

这可能会导致JVM抛出OutOfMemoryError。这在技术上不是崩溃,但在您的使用情况下,这可能意味着应用程序别无选择,只能放弃。

相关问题