2016-11-18 139 views
0

我需要使用perl CGI应用程序在浏览器上打印文本,我需要打印的文件大小可以为30-100MB或更大。 我有下面的代码使用Perl打印大文件CGI

$lns=$_[0]; 
    open(my $fh, '<:encoding(UTF-8)', $lns) or die "Could not open file '$lns' $!"; 
    while (my $l = <$fh>) { 
     chomp $l; 
     print "<br>$l"; 

    } 

效果很好,但它的速度很慢显示大的文件,30 MB的文件占用15分钟。 有没有办法加快速度? 为了澄清,文件开始立即显示,但浏览器继续加载并显示10 - 15分钟的新行,为30 - 40 MB文件。 该文件是静态的并且未被修改。

输入文件是固定的文本文件,它不会改变,也不会被

因此修改后,你应该做的从转换:

+0

你能解释它在哪里慢吗?您可以使用'$ | = 1'关闭缓冲区,然后浏览器前面的用户至少可以看到更多东西。但是这不会让它变得更快。 – simbabque

+0

在浏览器上打印行,显示整个文件30 MB需要15分钟或更多。基本上浏览器不断加载新行几分钟。只是想知道是否有办法加快这个过程,或者唯一的办法是将文件分成多个页面或类似的文件(我希望避免) – Cris

+0

文本是否真正动态? –

回答

2

您在评论中提到输入到输出格式一次并将访问者重定向到已生成的输出文件的位置。让服务器软件处理发送它。

此外,检查同一个浏览器在从本地文件系统加载时如何处理显示相同的内容。

请记住,您似乎不会发送text/plain内容。出于某种原因,您正在发送text/html并手动插入换行符。假设每行是512字节。对于一个40 MB的文件,这是DOM中超过80,000个节点。如果每行都是80个字节,我们正在讨论DOM中约525,000个节点。这可能会导致浏览器出现问题。

为了测试这一点,我创建了使用文件:

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $CHARS_PER_LINE = 72; 
my $text = 'x' x $CHARS_PER_LINE; 

for my $i (1 .. 40 * 1024 * 1024/$CHARS_PER_LINE) { 
    print "<br>$text\n"; 
} 

这给了我以下文件:

$ ls -lh ytt.html 
-rw-r--r-- 1 abc abc 43M Nov 18 13:31 ytt.html

然后,我在Firefox加载该文件从SSD上我MacBook Pro with 16GB memory。这导致CPU使用率在近30秒内飙升至100%,导致Firefox无响应,并导致Firefox分配额外的2.5GB内存。现在,如果您使用的计算机没有足够的备用内存,则必须交换到磁盘。在这种情况下,我可以轻松想象出导致严重可用性问题的场景。

打开与纯文本相同的文件不那么痛苦,但也不是很好。

您必须回答的一个问题是,是否有任何充分的理由在浏览器中显示此文档,或者应该只是以下载形式提供?

无论如何,您还应该确保您的网络服务器软件对文本文件应用压缩,以便您可以使用约10%的带宽来提供此文件。

+0

我不确定我是否理解你的意思,你建议我将一些HTML格式的文本文件转换为格式并让浏览器直接打开该文件? – Cris

+0

好吧,这是一个有趣的方法,将尝试一下,看看它是怎么回事 – Cris

+0

不要忘记:***另外,检查相同的浏览器处理从本地文件系统加载时显示相同的内容。*** –