0

我在一个与解析文本文件(应用 ETL 方法)相关的小型开发项目中。我创建了一个在我的本地机器上正确运行的演示代码,但是当我将它部署到 Apache Tomcat 容器时,它会产生很多与内存溢出、类型转换等相关的错误。

这是一般事实:

这是文件结构(注释指定每个单元格的数据类型和其他相关信息)。

请注意,RegisterType1每个客户仅重复一次,RegisterType2可以重复一次或多次,RegisterType3RegisterType4重复一次。

另请注意,每种寄存器类型的长度都不同,即:RegisterType1 12 个字段,RegisterType2 10 个字段,依此类推。

正如我之前所说,我当前的解析器编码很糟糕,会产生很多错误。这是实际代码这个(创建数据库连接和执行查询的类)。

这是一个需要解析的示例文本文件。

当前开发环境 平台:Java 6 容器:Tomcat 7 VPS 配置文件:RAM 1.7GB,存储:20GB,处理器:(Intel(R) Xeon(R) CPU X5650 @ 2.67GHz,24 核)。

实际问题:

  • 表现不佳
  • 内存溢出
  • 解析错误:数据类型转换、字段之间的分隔符(分号)(例如:...Paris;Fran[semicolon here]ce;...)

我想创建一个高效、正确和高性能的解析器。

我需要一些关于这个话题的建议。哪个是创建好的解析器的最佳方法?

提前感谢您提供信息。

问候,

4

1 回答 1

1

在此处发布您的相关代码。好的,我会为你做一些:

    BufferedReader reader = null;

    ArrayList< String> elements = new ArrayList< String>();

    try {
        reader = new BufferedReader(new FileReader(archivoFuenteDatos));
        String text = null;

        // repeat until all lines is read
        while ((text = reader.readLine()) != null) {
        ...
        elements.add(...);
        ...
    } catch(...) ...

    saveOnDB(elements);

永远不要读这样的大文件。如果这样做,您必须同时将所有数据保存在内存中。

  1. 尝试将每个条目直接写入数据库,而不是先复制到数组列表。这有望修复 OOM。

  2. 分析您的代码。如果它足够快,你就完成了。

  3. 如果不够快,请创建一个 ArrayList。给它一个初始容量nn在写入数据库之前,不超过该列表中的项目。

编辑:如果我没有错过重要的事情,您将自己的代码复制了 4 次。请在发布之前重构(代码太多)。例如,巨大的开关可以重构为这样的:

        while ((text = reader.readLine()) != null) {
            String[] campos = text.replaceAll(" +", " ").split(";");
            int n;
            switch (text.charAt(0)) {
                case '1':
                case '2':
                case '3':
                    n = campos.length - 1;
                    break;
                case '4':
                    // what does this mean? It will always give 5!
                    // n = contarPuntoComas(text) == 6 ? 5 : 5;
                    n = 5;
                    break;
                default:
                    n= 0;
            }
            for (int i = 0; i < n; ++i) {
                 elements.add(campos[ i].trim());
            } // end for
        }
于 2013-03-13T20:28:58.617 回答