java中如何高效处理字符串?

阿尔萨斯

有一个压缩文件,首先我需要解压它,然后读取该行的内容并通过拆分两个字段并使用其中一个作为密钥来处理每一行数据,然后加密另一个字段。部分代码如下:

try (GZIPInputStream stream = new GZIPInputStream(new ByteArrayInputStream(event.getBody()));
     BufferedReader br = new BufferedReader(new InputStreamReader(stream))) {
    String line;
    StringBuilder builder = new StringBuilder();
    while ((line = br.readLine()) != null) {
        builder.append(line);
        this.handleLine(builder);
        builder.setLength(0);
        builder.trimToSize();
    }
} catch (Exception e) {
    // ignore
}
  1. 每个压缩包大约有三百万行,所以如何在循环中高效处理字符串是整个程序性能的关键。
  2. StringBuilder像这样使用正确吗?
  3. 每行数据的格式如下:aaa|bbb|ccc|ddd|eee|fff|ggg|hhh.

我想知道的是如何正确使用StringStringBuilder在这个极大量的数据循环中。

约阿希姆·绍尔

为了在循环中处理许多单独的项目,基本上有两种可能的与内存管理相关的问题来源:

  1. 将不必要的每项数据保留在内存中,从而造成内存泄漏
  2. 通过为您处理的每个单独项目分配太多内存和/或太多单独对象来创建大量内存流失。

违反 #1 意味着您的总内存使用量将在整个循环中增加,从而为您可以处理的项目数量设置上限。

违反 #2 将“只会”导致更多的垃圾收集暂停,而不会导致您的应用程序失败(即它会变慢,但仍然可以工作)。

如果您确实需要StringBuilder(如您的评论所示),那么您应该摆脱trimToSize()调用(正如斯蒂芬 C 正确评论的那样),因为它基本上会强制StringBuilder重新分配line每次迭代中的内容的空间(有效地获得您非常非常少,只是StringBuilder在每次迭代中简单地重新创建)。

删除该调用的唯一缺点是StringBuilder在循环完成之前永远不会减少所使用的内存

只要该文件中的行长没有极端异常值,这可能不是问题。

作为附加说明:您提到这String.split对您来说效率太低。这种低效率的一个主要来源是它每次都需要重新编译正则表达式。如果您在循环外使用预编译模式Pattern.compile,然后Pattern.split()在循环内调用,那么这可能已经快得多了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Java中从许多字符串中高效地创建字符串

来自分类Dev

飞镖高效的字符串处理技术?

来自分类Dev

从Java中的子字符串高效解析整数

来自分类Dev

如何在Java中处理字符串

来自分类Dev

Java中的字符串处理数组

来自分类Dev

Java中的字符串处理

来自分类Dev

更高效的zsh字符串解析/数组处理

来自分类Dev

处理与Java中特殊字符的字符串

来自分类Dev

Java字符串处理

来自分类Dev

计算Java中ArrayList中字符串的出现-处理

来自分类Dev

如何在AWS DynamoDB中处理空的Java字符串集

来自分类Dev

如何分割字符串的Java中的空白时,处理突发空白

来自分类Dev

在Java中高效格式化字符串数组

来自分类Dev

从列表中搜索任何字符串的高效算法

来自分类Dev

链接列表中的字符串,对象的高效构造函数

来自分类Dev

高效访问 Pandas DataFrame 中的字符串值

来自分类Dev

Java中的中文字符串处理?

来自分类Dev

在 Java 中处理字符串数组元素

来自分类Dev

如何在TypeScript中处理ISO日期字符串?

来自分类Dev

OrderBy如何处理C#中的字符串?

来自分类Dev

如何在模板中处理字符串格式

来自分类Dev

如何在jQuery中处理JSON字符串?

来自分类Dev

如何在NSIS中处理字符串?

来自分类Dev

如何创建if语句以处理html中的空字符串

来自分类Dev

如何处理C中的字符串输入?

来自分类Dev

如何在JavaScript中的模运算处理字符串

来自分类Dev

如何处理f字符串中的错误?

来自分类Dev

如何处理UniData中的JSON字符串?

来自分类Dev

如何在jQuery中处理JSON字符串?