【问题标题】:how to migrate and process data in java with low memory and faster如何在java中以低内存和更快的速度迁移和处理数据
【发布时间】:2011-09-30 06:11:51
【问题描述】:

我有一个应用程序,它接收带有 DBF 中的平面表的文件,它标准化并转换并插入到 MySQL 数据库中,文件增长到 250,000 到 270,000 条记录之间,现在消耗大约 1.5 - 2 Gb 我必须重复过程和部分。

如果没有先前的记录,我会检查该过程,请在 HashMaps 中帮助我将唯一记录的键不保存其中的所有信息,这里的问题是要将文件上传到数据库 DBF 总记录数据增长,每次导入内容变得更慢并消耗更多内存,轻松在一个表中获得 770,000 条记录,并调用花费更多的 2,000,000

示例:

DBF 文件有 91 个字段,我已经规范化的数据库给出了 5 个主表,我必须重复记住 DBF 的过程 5 次。

迁移所有包含 250,000 条记录的 DBF 文件大约需要 1 小时。

你怎样才能最大限度地减少时间和内存消耗,除非内存消耗更低,我得到几个Exception in thread "main" java.lang.OutOfMemoryError: Java heap space


DBF文件结构有很多冗余数据是这样的(列):

  • 调查代码
  • 总体调查数据
  • encuenta 内的分组数据
  • 人员的详细信息

示例:

| survey_code | survey_columns | group_survey    | more_data | person_details |
|:------------|:---------------|:----------------|:----------|:---------------|
| 1           | ...            | 1               | ...       |1-oscar         |
| 1           | ...            | 1               | ...       |2-juan          |
| 1           | ...            | 2               | ...       |1-catalina      |
| 2           | ...            | 1               | ...       |7-john          |

注意:如您所见,有足够的数据冗余

MySQL数据库的结构是这样的:

Survery (table)
  id
  survey_data

Group_in_survey (table)
  survey_id      
  group_data

Person (table)
  group_id
  person_details   

导入过程按照表和依赖定义的顺序划分,对于每个表,贯穿DBF文件中的所有记录。

在我请求启动数​​据库之前,然后我将执行验证所需的信息加载到 HashMap 中,然后再将记录添加到 MySQL 中的数据库中。

此外,每次您将记录添加到 MySQL 数据库时,该记录 tamibén 添加到 HashMap,因为其中一个调试过程是重复的。后者在每个进程中完成

【问题讨论】:

    标签: java performance memory-management memory-leaks data-migration


    【解决方案1】:

    据我了解,您首先将记录插入 HashMap 以消除重复项,然后您将其复制到 MySQL 数据库中。如果是这种情况,您可以尝试使用 HugeCollections 库及其 HugeMap 而不是简单的 HashMap

    【讨论】:

      【解决方案2】:

      我想我更喜欢处理平面文件,先删除重复项并保存到临时文件,然后再进行完整的批量导入。这样您就永远不会遇到内存问题,并且如果有任何问题,您将备份您的第一步。

      【讨论】:

        【解决方案3】:

        看起来你在那里做了一些奇怪的事情,看起来你正在解析整个 dbf 文件,将其加载到内存中,然后一个接一个地插入到数据库中(希望不是每次都创建连接)。

        现在据我所知 dbf 很容易被流读取器读取,因此无需将所有内容加载到内存中,我认为批量读取 100 条记录将它们全部插入数据库会更好,或者您可以使用插入创建 sql 文件,然后在 mysql 上运行整个文件(但它会占用硬盘空间)。

        现在整个过程应该只占用处理一行的内存,这应该是稳定的。

        我需要更多地了解 dbf 文件的结构和你的表格才能说更多

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-17
          • 1970-01-01
          • 2014-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多