我有一个页面,允许用户上传和映射CSV文件。完成此操作后,将通过邮寄呼叫将行发送到另一台服务器上的页面。经过将近6,00次调用(准确地说是5787次),我开始收到控制台错误“无法加载资源:net :: ERR_INSUFFICIENT_RESOURCES”。
我尝试运行CSV文件中包含100行的页面,但效果很好...但是当我尝试大型列表(超过10,000行)时,页面冻结了。
这是进行帖子调用的代码:
for (var i = 0; i < manifestRows.length; i++)
{
$.post('http://www.otherserver.com/subfolder/handler.php', { tblName: 'foobar', thing1: manifestRows[i][0], thing2: manifestRows[i][1], thing3: manifestRows[i][2], thing4: manifestRows[i][3], thing5: manifestRows[i][4], thing6: manifestRows[i][5], thing7: manifestRows[i][6], thing8: manifestRows[i][7], thing9: manifestRows[i][8], thing10: manifestRows[i][9], thing11: manifestRows[i][10], thing12: manifestRows[i][11], thing13: manifestRows[i][12], thing14: manifestRows[i][13], thing15: manifestRows[i][14], thing16: manifestRows[i][15], thing17: manifestRows[i][16], thing18: manifestRows[i][17] }, function(data) {
if (data.length == 0)
{
var currentProcessing = $('#processingCurrent').html();
$('#processingCurrent').html(parseInt(currentProcessing) + 1);
var progress = Math.ceil((parseInt(currentProcessing) / manifestRows.length) * 100);
if (progress == 99)
progress = 100;
progress = progress + '%'
$("#progressBar").width(progress).html(progress);
if (progress == '100%')
{
$('#processdingDiv').hide();
$('#allDone').show();
}
}
else
alert(data);
});
}
我可以在用户端或其他服务器上放置一些代码,以防止发生此资源不足错误吗?
最佳答案
我在AngularJS应用中遇到了几乎完全相同的错误。我要做的是批量处理请求。批处理号码是相对于您的实例的,但我一次使用了1,000个呼叫。
由于很多情况都是异步发生的,因此我必须创建两个变量。 httpRequestsExpected
应与批处理大小相同,具体取决于您的代码。在我的系统中,每次调用$http.$get();
以获得精确值时,我都会对其递增。var batchSize = 1000;
var httpRequestsExpected;
var httpRequestsMade = 0;
然后在http成功和错误函数中,递增httpRequestMade
。
要解决一个批次,并且由于http有时会挂起,我无法进行完全匹配,例如:if(httpRequestsMade === httpRequestsExpected)
但必须这样填充:if(httpRequestsMade >== httpRequestsExpected - (httpRequestsExpected *0.01))
然后开始下一个批处理,将起始指针增加batchSize
并重置变量。这样就为进程完成提供了安全的缓冲量和时间,而无需消耗所有资源。