Javascript 在Chrome中获得大量AJAX响应而不会崩溃

Javascript 在Chrome中获得大量AJAX响应而不会崩溃,javascript,ajax,google-chrome,memory-management,memory-leaks,Javascript,Ajax,Google Chrome,Memory Management,Memory Leaks,我正在做一个针对Chrome浏览器的项目。我们希望实现的目标是将一百万条记录数组放入浏览器中,以处理数据。当我生成一个包含一百万条记录的测试文件时,它比1GB多一点 出于我将要解释的原因,我相信如果我们能够让浏览器在必要时收集垃圾,我们就可以实现这个目标。我相信浏览器会在不需要时保存AJAX响应的文本,并因此崩溃 现在,我可以在浏览器中生成一百万条记录,并根据需要对其进行操作。但是,我很难将AJAX发送到浏览器而不使其崩溃 自从发送了一百万次之后,我试着发送了十万次。我可以得到两个这样的批并解析

我正在做一个针对Chrome浏览器的项目。我们希望实现的目标是将一百万条记录数组放入浏览器中,以处理数据。当我生成一个包含一百万条记录的测试文件时,它比1GB多一点

出于我将要解释的原因,我相信如果我们能够让浏览器在必要时收集垃圾,我们就可以实现这个目标。我相信浏览器会在不需要时保存AJAX响应的文本,并因此崩溃

现在,我可以在浏览器中生成一百万条记录,并根据需要对其进行操作。但是,我很难将AJAX发送到浏览器而不使其崩溃

自从发送了一百万次之后,我试着发送了十万次。我可以得到两个这样的批并解析JSON。如果AJAX调用中没有onreadystatechange,我可以多次调用。此外,如果我收到十万条记录,我可以将其检查十次,然后生成完整的数组

因为我似乎能够实际保存一百万条记录,我相信,正如我所说的,保存回复文本是压倒浏览器的

为了获得更好的内存管理,我将AJAX重新请求和解析推送到了web worker中。当webworker获得AJAX并生成十万条记录数组时,它将其推送到DOM线程。DOM线程获取数据后,它会让web工作人员执行另一个AJAX

然而,它仍然崩溃

我愿意使用WebSocket或其他东西,如果这会有所帮助的话

以下是DOM线程中的代码:

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);