Javascript 在Chrome中获得大量AJAX响应而不会崩溃
我正在做一个针对Chrome浏览器的项目。我们希望实现的目标是将一百万条记录数组放入浏览器中,以处理数据。当我生成一个包含一百万条记录的测试文件时,它比1GB多一点 出于我将要解释的原因,我相信如果我们能够让浏览器在必要时收集垃圾,我们就可以实现这个目标。我相信浏览器会在不需要时保存AJAX响应的文本,并因此崩溃 现在,我可以在浏览器中生成一百万条记录,并根据需要对其进行操作。但是,我很难将AJAX发送到浏览器而不使其崩溃 自从发送了一百万次之后,我试着发送了十万次。我可以得到两个这样的批并解析JSON。如果AJAX调用中没有onreadystatechange,我可以多次调用。此外,如果我收到十万条记录,我可以将其检查十次,然后生成完整的数组 因为我似乎能够实际保存一百万条记录,我相信,正如我所说的,保存回复文本是压倒浏览器的 为了获得更好的内存管理,我将AJAX重新请求和解析推送到了web worker中。当webworker获得AJAX并生成十万条记录数组时,它将其推送到DOM线程。DOM线程获取数据后,它会让web工作人员执行另一个AJAX 然而,它仍然崩溃 我愿意使用WebSocket或其他东西,如果这会有所帮助的话 以下是DOM线程中的代码:Javascript 在Chrome中获得大量AJAX响应而不会崩溃,javascript,ajax,google-chrome,memory-management,memory-leaks,Javascript,Ajax,Google Chrome,Memory Management,Memory Leaks,我正在做一个针对Chrome浏览器的项目。我们希望实现的目标是将一百万条记录数组放入浏览器中,以处理数据。当我生成一个包含一百万条记录的测试文件时,它比1GB多一点 出于我将要解释的原因,我相信如果我们能够让浏览器在必要时收集垃圾,我们就可以实现这个目标。我相信浏览器会在不需要时保存AJAX响应的文本,并因此崩溃 现在,我可以在浏览器中生成一百万条记录,并根据需要对其进行操作。但是,我很难将AJAX发送到浏览器而不使其崩溃 自从发送了一百万次之后,我试着发送了十万次。我可以得到两个这样的批并解析
var iterations=3;
var url='hunthou.json';
var worker=new Worker('src/worker.js');
var count=0;
worker.addEventListener('message',function(e){
alert('count: '+count);
//bigArr=bigArr.concat(e.data);
console.log('e.data length: '+e.data.length);
bigArr[count]=e.data;
console.log('bigArr length: '+bigArr.length);
if(count<(iterations-1)){
worker.postMessage(url);
} else{
alert('done');
console.log('done');
worker.terminate();
console.log('bye');
}
count++;
});
worker.postMessage(url);
而不是一次发送整个数据
您可以创建多个请求来检索数据块,而不是一次检索整个数据,这将防止浏览器崩溃。100万条记录在一个ajax请求中发送?这真的是设计这个的唯一和最好的方法吗?由于
JSON.parse()
以及在运行JSON.parse()
操作期间可能出现的严重垃圾收集问题,您将拥有至少两个数据副本,更不用说在线程之间传递时可能产生的数据副本了。数据的多个副本可能至少是问题的一部分。用户的内存将无法保存那么多记录,无论你如何提取它们。这是一个糟糕的应用程序结构,不是内存泄漏或ajax的问题。@jfriend00我特别说过我将其拆分为多个请求。@JamesG。我特别说过,我已经确定浏览器确实保存了那个数量的记录,并允许对数据进行操作。如果让浏览器生成记录,则没有问题。
var arr=[];
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
var DONE = this.DONE || 4;
if (this.readyState === DONE){
arr=JSON.parse(request.responseText);
self.postMessage(arr);
arr.length=0;
request.responseText.length=0;
console.log('okay');
}
};
self.addEventListener('message', function(e) {
var url=e.data;
console.log('url: '+url);
request.open("GET",'../'+url,true);
request.send(null);
}, false);