使用perl CGI打印大文件

时间:2016-11-18 15:37:52

标签: perl

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

    $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文件。 该文件是静态的,未被修改。

1 个答案:

答案 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

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

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

您必须回答的一个问题是,该文档是否有充分的理由在浏览器中显示,还是应该只是下载?

在任何情况下,您还应确保您的Web服务器软件对文本文件应用压缩,这样您就可以使用大约10%的带宽来提供此文件。