gpt4 book ai didi

java - 解析文本文件: Efficiency and perfomance

转载 作者:行者123 更新时间:2023-12-01 14:46:33 27 4
gpt4 key购买 nike

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

这是普遍事实:

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

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

另请注意,每种寄存器类型的长度各不相同,即:RegisterType1 12 个字段、RegisterType2 10 个字段等。

正如我之前所说,我当前的解析器的编码非常糟糕,以至于会产生很多错误。 This is the actual codethis one (创建数据库连接并执行查询的类)。

这是一个example text file谁需要解析。

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

实际问题:

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

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

我需要对此主题的一些建议。创建一个好的解析器的最佳方法是什么?

预先感谢您提供的信息。

问候,

最佳答案

在这里发布您的相关代码。好的,我会为您做一些:

    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。给它一个初始容量n。在写入数据库之前,在该列表中读取不超过 n 个项目。

编辑:如果我没有错过重要的事情的话,你把自己的代码复制了四次。请在发布之前重构(代码太多)。例如,巨大的开关可以重构为如下所示:

        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
}

关于java - 解析文本文件: Efficiency and perfomance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15395517/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com