我正在编写一个脚本来获取然后解析大量的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 Task Manger,我可以确认Internet Explorer的内存使用率大约为6,000K,因此我认为我没有内存泄漏。
有谁知道防止这种情况的方法?
答案 0 :(得分:1)
这是你的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();
}
}
subChunk
?第一次调用readXML时,subChunk(如果这是你的所有代码)将是未定义的。total
同上。在哪里定义/初始化?chunk
同上。哪个定义初始化?max
同上。哪个定义初始化?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 ,然后迭代结果,拉出所有相关节点。