【问题标题】:StringBuilder taking time to store String valueStringBuilder 花时间存储字符串值
【发布时间】:2016-02-09 14:55:57
【问题描述】:

我将日志存储到 StringBuilder Object 中。几乎有 214873 行正在被存储。每次代码发现错误时,错误消息都会存储在 StringBuilder 对象中,并附加到下一个错误等等。

最后当所有的错误信息都被记录下来时。 StringBuilder 对象中的行被写入 hdfs。我面临的问题是,将完整的错误消息存储到 StringBuilder 对象中需要 6 个小时。有什么方法可以减少存储时间,以便在生产集群中运行 code fatser?

提前致谢。

【问题讨论】:

  • 你为什么要那样做?
  • 只是因为在这种情况下我不能使用记录器。我们的集群中没有 log4j 设置。
  • 我认为您需要更好地解释一下背景,因为您根本不清楚为什么要将日志条目存储在所有位置的内存中,更不用说巨大的字符串了。跨度>
  • 您的日志消息有多长?你的进程消耗了多少内存,机器有多少?您是否考虑将消息写入临时文件?
  • 不要将所有邮件存储在StringBuilder 中。即使您不想正确设置日志记录,您也可以存储一个字符串列表而不是一个庞大的StringBuilder

标签: java string hadoop hdfs stringbuilder


【解决方案1】:

我可以添加到 StringBuilder 的最大大小是 Integer.MAX_SIZE-2

public static void main(String[] args) {
    int maxSize = Integer.MAX_VALUE - 2;
    long start = System.currentTimeMillis();
    StringBuilder sb = new StringBuilder(maxSize);
    while (sb.length() < maxSize)
        sb.append(' ');
    long time = System.currentTimeMillis() - start;
    System.out.println("Took " + time / 1e3 + " second to create a StringBuilder of " + sb.length());
}

这会打印出来

Took 7.415 second to create a StringBuilder of 2147483645

这是一次只写一个字符,所以它真的应该花更长的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 2014-11-05
    • 2017-10-07
    • 2016-02-16
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    相关资源
    最近更新 更多