【问题标题】:Concatenation consumes a lot of memory, how can I optimize it?拼接占用大量内存,如何优化?
【发布时间】:2018-11-27 13:38:09
【问题描述】:

连接会消耗大量内存。如果我们认为字符占用大约 2 个字节,那么生成的代码行应该占用大约 20 MB,但是当下面显示的代码工作时,页面消耗大约 1GB。尝试使用Join,或者执行操作s + = 'q';在功能等方面,没有任何帮助。我该如何优化,例如在“.net”中有一个StringBuilder?

var i = 0
       var s = "q";
   while (i <10000000) {
     s + = 'q';
 
     i ++;
   }

附言

let str = Array (10000000) .fill (`g`) .join``;

或

'g'.repeat (10000000)

不适合,需要串联。

【问题讨论】:

  • i &lt;10,000,000) 不对。 JavaScript 中的数字没有逗号
  • 什么应用程序要求你显示这个数量的 q's?
  • 实验将大量文本合并成一个字符串。
  • 只是需要考虑的一点:Javascript 字符串是不可变的。

标签: javascript concatenation ram


【解决方案1】:

您仍然可以使用 join - 您无需使用 fill 一次性创建整个数组:

var i = 0;
var a = [];
while (i <10000000) {
    a[i] = 'q';
    i++;
}
var s = a.join('');

这样,您可以将需要的任何字符(或更大的字符串)“连接”到数组的元素中,然后最终在一次操作中将它们全部连接起来。

【讨论】:

    【解决方案2】:

    尝试向可以执行此操作的 Web 服务器发出 Http 请求并仅返回结果。我也会尝试一个网络工作者(新的浏览器支持它),但我不确定内存消耗。但它不会使用 UI 线程。

    我会使用 setTimeout 将此操作分解为一组较小的操作,例如制作 100 个 100000 个字符串,然后将它们连接起来,而不是连接 10000000 个一个字符字符串。

    【讨论】:

    • 如果这个是网络服务器呢?考虑到如今 JavaScript 运行在更多的地方,而不仅仅是浏览器。
    • 所以我们需要更多地了解上下文——它是在哪里完成的。
    • 即使是客户端/服务器,我希望处理一千万个字符串最好留在客户端而不是通过网络传输...
    • 我扩展了答案 - 首先在 setTimeout 中创建 100000 个字符串,然后将它们连接起来。它将允许释放内存。
    • async/await这个可以用吗? :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    相关资源
    最近更新 更多