gpt4 book ai didi

Javascript:内存不足

转载 作者:行者123 更新时间:2023-11-30 06:03:26 26 4
gpt4 key购买 nike

我正在编写一个脚本来获取然后解析大量 XML 文档。代码的相关部分如下所示。 (为了隐私已经隐藏了URL。代码中的星号实际上并不存在,它们在后面的问题中用作引用)

var xmlhttp = new XMLHttpRequest();
var xmlDoc;
var chunk = parseInt(1, 10);
var subChunk = parseInt(0, 10);
var indvCount = parseInt(0, 10);
var total = parseInt(0, 10);
var max = parseInt(5000, 10);
var end = parseInt(chunk, 10) * parseInt(20, 10);
var start = parseInt(end, 10) - parseInt(19, 10);

function loadXML() {

xmlhttp.abort();
*xmlhttp.open("GET", "URL-GOES-HERE?start=" + start + "&end=" + end, false);
xmlhttp.setRequestHeader('Content-Type', 'text/xml', 'Pragma', 'no-cache');
xmlhttp.send("");
while (xmlhttp.readyState != 4) { }
xmlDoc = xmlhttp.responseXML;
readXML();

}


function readXML() {

while (subChunk < 20) {
*indvCount = xmlDoc.getElementsByTagName("Value")[subChunk].childNodes[0].nodeValue;
total = parseInt(total, 10) + parseInt(indvCount, 10);
subChunk = parseInt(subChunk, 10) + parseInt(1, 10);
}
chunk = parseInt(chunk, 10) + parseInt(1, 10);
subChunk = parseInt(0, 10)
end = parseInt(chunk, 10) * parseInt(20, 10);
start = parseInt(end, 10) - parseInt(19, 10);
if (chunk > max) {
alert(total);
} else {
loadXML();
}

}

chunk 等于大约。 5,000 或更多,我收到 Out of Memory 错误。该错误通常是指带星号的代码行之一。使用 Windows 任务管理器,我可以确认 Internet Explorer 的内存使用量保持在大约 6,000K,因此我认为我没有内存泄漏。

有谁知道防止这种情况发生的方法吗?

最佳答案

这是您重写的 readXML,以消除无用的废话。代码后的批评/问题:

function readXML() {
while (subChunk < 20) {
indvCount = xmlDoc.getElementsByTagName("Value")[subChunk].childNodes[0].nodeValue;
total = total + parseInt(indvCount, 10);
subChunk++;
}
chunk++;
subChunk = 0;
end = chunk * 20;
start = end - 19;
if (chunk > max) {
alert(total);
} else {
loadXML();
}
}
  1. 你在哪里初始化subChunk?第一次调用 readXML 时,subChunk(如果这是您的所有代码)将是未定义的。
  2. 总计 也是如此。在哪里定义/初始化?
  3. block 也是如此。在哪里定义初始化?
  4. 同上 max。在哪里定义初始化?
  5. 请注意,除了一个 parseint 之外,我已经删除了所有的 parseint。除非你在那里做各种疯狂的 int/string 转换,唯一严格要求的地方是将你的 XML 检索字符串转换为你的 total 计数的数字。

好的。像这样重写怎么样......它仍然使用全局变量(坏坏坏),但更正确和高效:

function readXML() {
var values = xmlDoc.getElementsByTagName("Value");
for (i = 0; i < values.length; i++) {
total += parseInt(values[i].childNodes[0].nodeValue);
}
chunk++;
end = chunk * 20;
start = end - 19;
if (...) { ... }
}

您的代码执行重复的 getElementsByTagName 调用(开销很大),访问一个值,然后丢弃所有其他值。另一个 gEBTN() 调用,访问另一个值,丢弃结果,yada yada yada。 CPU 周期、内存等的主要浪费...使用上述构造,您执行 gEBTN() ONCE 然后迭代结果,提取所有相关节点。

关于Javascript:内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6836820/

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