我需要使用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文件。 该文件是静态的,未被修改。
答案 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%的带宽来提供此文件。