有一个压缩文件,首先我需要解压它,然后读取该行的内容并通过拆分两个字段并使用其中一个作为密钥来处理每一行数据,然后加密另一个字段。部分代码如下:
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
}
StringBuilder
像这样使用正确吗?aaa|bbb|ccc|ddd|eee|fff|ggg|hhh
.我想知道的是如何正确使用String
和StringBuilder
在这个极大量的数据循环中。
为了在循环中处理许多单独的项目,基本上有两种可能的与内存管理相关的问题来源:
违反 #1 意味着您的总内存使用量将在整个循环中增加,从而为您可以处理的项目数量设置上限。
违反 #2 将“只会”导致更多的垃圾收集暂停,而不会导致您的应用程序失败(即它会变慢,但仍然可以工作)。
如果您确实需要StringBuilder
(如您的评论所示),那么您应该摆脱trimToSize()
调用(正如斯蒂芬 C 正确评论的那样),因为它基本上会强制StringBuilder
重新分配line
每次迭代中的内容的空间(有效地获得您非常非常少,只是StringBuilder
在每次迭代中简单地重新创建)。
删除该调用的唯一缺点是StringBuilder
在循环完成之前永远不会减少所使用的内存。
只要该文件中的行长没有极端异常值,这可能不是问题。
作为附加说明:您提到这String.split
对您来说效率太低。这种低效率的一个主要来源是它每次都需要重新编译正则表达式。如果您在循环外使用预编译模式Pattern.compile
,然后Pattern.split()
在循环内调用,那么这可能已经快得多了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句