【问题标题】:How to handle huge data in java如何在java中处理大量数据
【发布时间】:2009-08-12 23:09:23
【问题描述】:

现在,我需要将大量数据从数据库加载到向量中,但是当我加载 38000 行数据时,程序抛出 OutOfMemoryError 异常。 我该怎么办?

我认为我的程序中可能存在一些内存泄漏,检测它的好方法吗?谢谢

【问题讨论】:

  • 感谢您的回答,但我不想增加堆大小,我想我可能需要找到一个好的算法。
  • @Hooligan:告诉我们为什么要将数据加载到向量中,也许我们可以为您提供一个好的算法。
  • 我们的旧程序遇到这样的内存不足错误,所以我需要对其进行优化,程序将所有数据加载到字段中,然后在此基础上进行处理。
  • @Hooligan:你错过了@Brian 的观点。您需要告诉我们更多关于数据和/或您的程序如何处理这些数据的信息。否则,没有人可以提供任何具体的解决方案来避免将这 38,000 行加载到一个太大而无法容纳您可用内存的巨大 Vector 中。
  • 谢谢,我想我已经解决了,因为我们的程序加载了一些冗余数据!

标签: java database


【解决方案1】:

为您的 JVM 提供更多内存(通常使用 -Xmx/-Xms)或者不要将所有数据加载到内存中。

对于大量数据的许多操作,有些算法不需要一次访问所有数据。一类这样的算法是divide and conquer algorithms

【讨论】:

    【解决方案2】:

    如果您必须将所有数据保存在内存中,请尝试缓存常见的对象。例如,如果您正在查看员工记录并且它们都有一个职位,那么在加载数据时使用 HashMap 并重用已经找到的职位。这可以显着降低您使用的内存量。

    另外,在你做任何事情之前,使用分析器来查看内存被浪费的地方,并检查可以被垃圾收集的东西是否没有浮动引用。同样,String 是一个常见示例,因为例如,如果您使用 2000 字符字符串的前 10 个字符,并且您使用子字符串而不是分配新字符串,那么您实际上拥有的是对 char[2000 ] 数组,两个索引分别指向 0 和 10。同样,这是一个巨大的内存浪费。

    【讨论】:

      【解决方案3】:

      您可以尝试增加堆大小:

       java -Xms<initial heap size> -Xmx<maximum heap size>
      

      默认是

      java -Xms32m -Xmx128m
      

      【讨论】:

      • 最大为 1024m,取决于您的平台(似乎是最大可分配内存块)。
      • 他说程序在38000行数据后抛出OutOfMemoryError,我认为还有更多,恕我直言他无法继续增加堆大小以跟上。
      • 据我所知,没有最大值。我使用 4GB 堆运行。
      • 是的。如果他仍然使用蛮力方法,他也应该知道限制。
      • @Tommy,是的,这就是我读到的。但是在我的机器上(安装了 3.2 GB - 4 GB 的 win xp 32 位)我只设法将 Xmx 设置为 ~1024m。
      【解决方案4】:

      你真的需要在内存中存储这么大的对象吗?

      根据您对该数据的处理方式,您可能希望将其拆分为更小的块。

      【讨论】:

        【解决方案5】:

        逐段加载数据。这不会让您同时处理所有数据,但您不必更改提供给 JVM 的内存。

        【讨论】:

          【解决方案6】:

          您可以使用分析器运行您的代码,以了解内存被占用的方式和原因。通过循环调试您的方式并观察正在实例化的内容。它们的数量不限; JProfiler,Java Memory Profiler,参见list of profilers here,等等。

          【讨论】:

            【解决方案7】:

            也许优化您的数据类?我见过一个案例,有人在内存中存储相对少量的数据对象时,为每个给出 OutOfMemoryError 的类成员使用字符串来代替本机数据类型,例如 int 或 double。看看你没有复制你的对象。当然,增加堆大小:

            java -Xmx512M(或任何你认为必要的)

            【讨论】:

              【解决方案8】:

              让您的程序使用更多内存或更好地重新考虑策略。内存中真的需要这么多数据吗?

              【讨论】:

                【解决方案9】:

                我知道您正在尝试将数据读入矢量 - 否则,如果您尝试显示它们,我会建议您使用 NatTable。它是为将大量数据读入表格而设计的。

                我相信这里的其他读者可能会派上用场。

                【讨论】:

                  【解决方案10】:

                  使用内存映射文件。内存映射文件基本上可以随心所欲地增长,而不会碰到堆。它确实要求您以对解码友好的方式对数据进行编码。 (例如,为数据中的每一行保留固定大小是有意义的,以便快速跳过许多行。)

                  Preon 让您轻松应对。它是一个框架,旨在对二进制编码数据进行 Hibernate 对关系数据库所做的工作,以及将 JAXB/XStream/XmlBeans 转换为 XML。

                  【讨论】:

                    猜你喜欢
                    • 2013-01-10
                    • 2011-01-10
                    • 2011-11-24
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-10-01
                    • 2013-04-09
                    • 2014-06-12
                    • 2015-02-24
                    相关资源
                    最近更新 更多