在web上逐行输出较大的txt文件

在某些场景下,需要在web上展示一些日志文件,这些日志文件是放在文件服务器上的一些txt。

当日志文件很大时,下载日志会导致页面长时间卡住,一直在loading状态,而且下载完日志之后分析日志并生成dom,瞬间大量的dom渲染可能导致页面崩溃。

于是想着优化一下日志的输出方式,开始下载即在页面上一行一行打印日志,就像一些IDE中输出程序的编译过程一样。

最终实现的方法如下:

在下载文件的时候,让请求过一层代理,代理写输出流的时候分段输出:

?

int l;
        byte[] buffer = new byte[100];
        string llength = "";
        int lsum = 0;
        do
        {
            l = proxyResponseStream.Read(buffer, 0, buffer.Length);
            llength += "," + l;
            lsum += l;
            if (l > 0)
            {
                context.Response.Write(System.Text.Encoding.UTF8.GetString(buffer, 0, l));
                context.Response.Flush();
            }
        }
        while (l > 0);
        context.Response.End();

客户端请求:

var xhr = new XMLHttpRequest();
xhr.open(‘GET‘, url, true);
xhr.onreadystatechange = function (e) {
                if (this.readyState == 3) {
                    //alert(1);
                    var newload = e.target.responseText.slice(logs[type].length);
                    var newloadLogs = newload.split(‘\n‘);
                    newloadLogs.forEach(function (line, index) {
                        if (index == newloadLogs.length - 1) return;
                        logs[type] += line + ‘\n‘;
                        $("#" + type).append("<p class=‘logline " + getLogType(line) + "‘>" + line + "</p>");
                        document.body.scrollTop = document.body.scrollHeight;
                    });
                }
            };
            xhr.onload = function () {
                if (callback) callback();
            }
            xhr.send();
onreadystatechange

response多次输出值时,readystate一直是3,onreadystatechange事件可以被多次触发,。

这样确实可以实现上面所说,无需等待直接开始逐行打印日志。

但是在实现的过程中发现了这样一些问题

1.response对象在向客户端写输出流的时候,自己也是有设置一个类似buffer的东西的,只不过这个buffer尺寸很大,对于一般的txt,就算捕获了readystatechange事件,也感觉不出来是在分段输出。当buffer的尺寸被手动设小,满了直接flush的时候,就可以看到日志一小段一小段的打印出来了。不幸的是,这样会大大降低文件被下载的速度,并且占用大量系统资源,失去了优化日志展现的初衷。

2.response在一段一段输出文件内容的时候,在readystatechange事件中并不能获得每一段输出的值,而是把新输出的内容不断往已输出内容后边append。这样要一段一段解析dom,就需要不断的去记录位置、截取字符串,这样对浏览器来说是一个巨大的消耗。

3.我拿一个30M大小的txt在本机上测试,开始输出日志后CPU占用瞬间到90%,输出大约一半后浏览器崩溃...

所以最终得出的结论是:这种方式只能作为日志文件不大的情况下,对交互体验的一种优化,且需要消耗大量系统资源。浏览器中不适合直接展示比较大的txt,它长时间的下载等待以及对浏览器造成的巨大压力是无法优化的,要么分段查看,要么下载后查看或者对其作分析后展现结果。

在web上逐行输出较大的txt文件,布布扣,bubuko.com

时间: 2025-01-15 15:43:08

在web上逐行输出较大的txt文件的相关文章

将控制台输入的每一行字符串,输出至txt文件当中

/** *    需求:将控制台输入的每一行字符串,输出至txt文件当中. /** * 需求:将控制台输入的每一行字符串,输出至txt文件当中. * 思路: * 1.首先想到BufferReader高级流读取一行字符串readLine方法. * 2.但是前提依赖于字符转换流ISR和低级节点流,这里是从控制台输入,节点流自然是System.in.如果是从文件输入,则节点流换成FIS即可 * 3.这样就能建立一条输入流了.BufferedReader(new InputStreamReader(Sy

Web上传文件的原理及实现

现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的Commons FileUpload.还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2在底层也使用了Commons FileUpload). 虽然现在有很多上传组件可以利用,但是了解Web上传文件的原理,对于处理突然出现的问题会有很大的帮助,下面就来讲一下通过浏览器上传文件的基本原理.在了解了原理之后,就可以非常容易地自制满足自身需要的上传组件了. 众所周知,在客户端代码中需要使用<

[转]文件上传原理:Web上传文件的原理及实现

现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的CommonsFileUpload.还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2在底层也使用了CommonsFileUpload).在asp.net中也有相应的上传文件的控件. 虽然现在有很多上传组件可以利用,但是了解Web上传文件的原理,对于处理突然出现的问题会有很大的帮助,下面就来讲一下通过浏览器上传文件的基本原理.在了解了原理之后,就可以非常容易地自制满足自身需要的上传组件

PHP逐行输出数据并解决两种常见缓冲问题

博主热衷各种互联网技术,常啰嗦,时常伴有强迫症,常更新,觉得文章对你有帮助的可以关注我. 转载请注明"深蓝的镰刀" 1.遇到问题 不知你们有没有碰到过这样两种情况: 老板要你将数据库中所有的数据在浏览器中展示出来,因为需要对比数据,老板要求是不能使用分页,那么好了,输出个1000条数据直接循环打印出来没问题,但是数据如果是几百万条呢?浏览器直接卡死,等你离开座位出去喝了杯咖啡,上了个厕所,和前台mm聊了个天,回来发现浏览器已经"程序未响应"了,你该怎么办? 老板让你

web前端之HTML的大框架(body元素与frameset元素)

web前端之HTML的大框架      body元素与frameset元素 对于从事html的人员来说,我们一般熟悉的框架是先声明html ,然后在<html>标签对里包着<head>标签对和<body>标签对,body元素定义文档的主体,包含文档的所有内容(比如文本.超链接.图像.表格和列表等等).而我们想要在页面中显示出来的内容全部写在<body>标签对里. 例如: <!DOCTYPE html> <html> <head&

web上种图片应用的优缺点

web中承载信息的主要方式就是图片与文字了,以下就是对一些web图片格式的优缺点进行归纳. 1.GIF GIF图是比较古老的web图片格式之一,可以追溯到1987,几乎所有的浏览器都支持这一种格式,老有老的好处嘛.GIF是一种索引色模式图片,所以GIF每帧图所表现的颜色最多为256种.GIF能够支持动画,也能支持背景透明,这点连古老的IE6都支持,所以在以前想要在项目中使用背景透明图片,有一些方案就是生成GIF图片.GIF与JPEG.PNG相比,在通常情况下确实体积比较小.不过里面如果放入了足够

Erlang Port实现调用系统命令并逐行输出执行过程

最近在做一个通过WEB调用系统命令的工具,难点是如何获取执行过程,同时可以逐行输出? 想起以前有看到霸爷提到rebar中封装了类似的功能,于是从rebar_utils中整出了下面的东西,很好用. -module(sh_port). -export([sh/1, sh/2]). %% %% Options = [Option] -- defaults to [use_stdout, abort_on_error] %% Option = ErrorOption | OutputOption | {

[转]你会做Web上的用户登录功能吗?

转自:http://coolshell.cn/articles/5353.html Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能.下面的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关系到用户安全的功能,希望大家能从下面的文章中能知道什么样的方法才是一个好的用户登录功能.以下内容,转载时请保持原文一致,并请注明作者和出处. 用户名和口令 首先,我们先来说说用户名和口令的事.这并不是本站第一次谈论这

通过 Job History Server 的 web console 查阅在 Yarn 上 MapReduce job 的 job conf xml 文件

很多时候,Yarn 的用户希望知道自己运行过的某个 MapReduce job 的运行参数,此时可以从MapReduce History Server的 web console上查阅该 job的conf xml 文件内容.当然用户也可以先登录Yarn 的 web console的地址,然后再从上面跳转到 Job History Server 的 web console进行查阅.本文将以一个简单的图文例子来具体演示该功能. 步骤: 1.在启动 Job History Server 前,在mapre