gpt4 book ai didi

javascript - 在 javascript 中处理大型数组时释放浏览器内存的最佳方法是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 04:43:14 24 4
gpt4 key购买 nike

我是这样设置的:

  • container.html
  • database1.js(包含名为database1的大数组)
  • database2.js(包含名为database2 的大数组)

这是数组的示例(从 6000 多行缩短为 2 行):

var database1=[[
"2010-01-03 07:45","2010-01-03 11:00","534","A","","","","","Installed washing machine","0","1","1","Indeed","",""],[
"2010-03-20 15:00","2010-03-20 16:00","571","F","","","","","Installed oven","0","5","1","Indeed","",""],[
etc,etc,etc...]];

当我将 database1.js 附加到容器的头部时,Windows 中用于 IE 的内存从 7.7MB 跃升至 21.9MB。这很好,我现在可以遍历名为 database1 的数组(第一行和第一列位于 database1[0][0])。

问题是我需要不时地重新附加数据库文件,这样做会增加内存使用量(我认为数据库数组会被覆盖)。

因此,第一次重新附加将 IE 中的内存使用量推高至 30,4MB,但随后在每次重新附加时继续增加:30,4MB > 33,9MB > 39,5MB > 42,1MB 等。

为防止这种情况发生,我现在在重新附加 database1 文件之前清除数组中的每个项目。

for ( var i=0, il=database1.length; i<il; i++ ){
delete database1[i];
}
//append database1.js to head code here

这确实有帮助。内存使用量并没有减少到最初的 7.7MB,而是从 21.9MB 减少到 14.1MB。下一次重新附加将内存增加到 25,9MB(通过循环清除:18,8MB)。下一次重新附加将内存增加到 29.3MB(通过循环清除:24.5MB)。

我很高兴内存使用率没有上升得那么快,但也许这可以进一步优化?不幸的是,重新加载 HTML 页面不是一个选项。

最佳答案

JavaScript 中的内存管理由垃圾收集器提供帮助,垃圾收集器是一种定期释放不再需要的内存的语言功能。

delete 运算符本质上表示不再需要内存区域。当垃圾收集器下次运行时,内存将被释放。

垃圾收集是不可预测的 - delete $var$var = null 将允许垃圾收集器最终释放内存。这可能不是即时的。这就是为什么内存使用量没有像您预期的那样快速攀升,这就是为什么 delete $var 没有像您预期的那样快速减少内存使用量。

IE 确实提供了一种强制垃圾收集器运行的方法:

if (typeof(CollectGarbage) == "function") {
CollectGarbage();
}

发生这种情况时,您的脚本可能会变慢,尤其是在有大量内存要释放时。

最好避免强制垃圾收集 - 让垃圾收集器在它确定最合适的点运行。 CollectGarbage() 也没有记录 - 行为可能会改变或函数可能随时被删除。

简而言之:

  • 你对 delete database1[i] 的使用是你能做的最好的
  • 这将最终释放内存
  • 内存使用将最终恢复到预期水平
  • 您可以在 IE 中强制进行垃圾回收,但这个过程最终会自行发生

关于javascript - 在 javascript 中处理大型数组时释放浏览器内存的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3079630/

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