javascript – 使用xhr.onprogress来处理大型ajax下载而不会耗尽内存?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 使用xhr.onprogress来处理大型ajax下载而不会耗尽内存?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2054字,纯文字阅读大概需要3分钟。
内容图文
![javascript – 使用xhr.onprogress来处理大型ajax下载而不会耗尽内存?](/upload/InfoBanner/zyjiaocheng/970/9cf2ac00e5b541058d336f10f950592a.jpg)
假设我的公司提供大型日志文件(4 GB),其中最新的日志位于顶部.我想构建一个网页来搜索该文件中的关键字“Mike”.带宽不是限制,但此网页只能是静态文件(即没有服务器端功能).
示例日志文件:
Joe completed Task 1234 on 2013-10-10
Joe completed Task 1235 on 2013-10-11
Mike completed Task 1236 on 2013-10-11
Joe completed Task 1237 on 2013-10-13
...
显然,我无法将整个文件放入浏览器的内存中,因此我试图找到一种方法来请求文件,在下载数据时搜索数据,然后丢弃不相关的数据以节省内存.我正在使用xhr.onprogress事件通过xhr.responseText获取部分下载的日志文件并进行搜索,但是在读完之后我无法重置responseText.
到目前为止,这是我的算法:
var xhr = new XMLHttpRequest();
xhr.onprogress = function(e){
var cur_len = xhr.responseText.length;
var found_mike = xhr.responseText.indexOf("Mike") != -1 ? true : false;
xhr.responseText = ""; //clear responseText to save memory
console.log("%d - %s - %d", cur_len, found_mike, xhr.responseText.length);
};
xhr.open("get", "mylogfile.txt", true);
xhr.send();
我希望控制台能说出234343 – false – 0之类的内容,但我得到234343 – false – 234343,浏览器内存不足(因为responseText没有被清除).
有没有办法可以丢弃responseText,以便浏览器可以下载和处理文件,而无需将整个文件保存在内存中?
编辑:另外,如果responseText是只读的,为什么不抛出错误/警告?
解决方法:
在问了一位朋友之后,他得到了一个很好的答案:Range headers(stackoverflow question,jsfiddle)
var chunk_size = 100000; //100kb chunks
var regexp = /Mike/g;
var mikes = [];
function next_chunk(pos, file_len){
if(pos > file_len){
return;
}
var chunk_end = pos + chunk_size < file_len ? pos + chunk_size : file_len;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 206){
//push mikes to result
while ((match = regexp.exec(xhr.responseText)) != null) {
mikes.push(pos + match.index);
}
//request next chunk
file_len = parseInt(xhr.getResponseHeader("Content-Range").split("/")[1]);
next_chunk(chunk_end + 1, file_len);
}
};
xhr.open("get", "mylogfile.txt", true);
xhr.setRequestHeader("Range", "bytes=" + pos + "-" + chunk_end);
xhr.send();
}
next_chunk(0, chunk_size);
内容总结
以上是互联网集市为您收集整理的javascript – 使用xhr.onprogress来处理大型ajax下载而不会耗尽内存?全部内容,希望文章能够帮你解决javascript – 使用xhr.onprogress来处理大型ajax下载而不会耗尽内存?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。