2016-11-18 3 views
0

Ich muss Text im Browser mit meinem Perl CGI-Anwendung drucken, die Datei, die ich drucken muss, kann von großer Größe 30 - 100 MB oder mehr sein. Ich habe den folgenden CodeDrucken großer Dateien mit 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"; 

    } 

die gut funktioniert, aber es ist sehr langsam Anzeige große Datei, 30 MB Datei 15 Minuten dauern. Gibt es eine Möglichkeit, es zu beschleunigen? Zur Verdeutlichung wird die Datei sofort angezeigt, aber der Browser lädt und zeigt neue Zeilen für 10 - 15 Minuten für 30 - 40 MB an. Die Datei ist statisch und wird nicht geändert.

+0

Können Sie erklären, wo es langsam ist? Sie könnten die Pufferung mit '$ | = 1' ausschalten, dann würde der Benutzer vor dem Browser zumindest etwas früher sehen. Aber das wird es nicht schneller machen. – simbabque

+0

das Drucken von Zeile auf dem Browser, um die gesamte Datei 30 MB anzuzeigen dauerte 15 Minuten oder mehr. Grundsätzlich lädt der Browser immer wieder neue Zeilen für einige Minuten.Ich frage mich nur, ob es eine Möglichkeit gibt, den Prozess zu beschleunigen, oder der einzige Weg besteht darin, die Datei in mehrere Seiten oder ähnliches aufzuteilen (was ich vermeiden wollte) – Cris

+0

Ist der Text wirklich dynamisch? –

Antwort

2

erwähnt Sie in den Kommentaren:

Die Eingabedatei fest Textdatei ist, wird es nicht ändern und nicht

daher geändert werden, sollten Sie die Umstellung von der tun Eingabe in das Ausgabeformat einmal und umleiten Besucher an den Speicherort der bereits generierten Ausgabedatei. Lassen Sie die Server-Software das Senden übernehmen.

Überprüfen Sie auch, wie gut derselbe Browser damit umgeht, wenn er denselben Inhalt anzeigt, wenn er vom lokalen Dateisystem geladen wird.

Denken Sie daran, dass Sie scheinen nicht zu senden text/plain Inhalt. Aus irgendeinem Grund senden Sie text/html und fügen Zeilenumbrüche manuell ein. Nehmen wir an, jede Zeile ist 512 Bytes. Für eine 40-MB-Datei sind das mehr als 80.000 Knoten im DOM. Wenn jede Zeile 80 Bytes umfasst, sprechen wir von fast 525.000 Knoten im DOM. Das kann Probleme mit dem Browser verursachen.

Um dies zu testen, habe ich eine Datei mit:

#!/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"; 
} 

Dies gab mir die folgende Datei:

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

Dann lud ich dieses Dokument in Firefox von der SSD auf meinem MacBook Pro with 16GB memory. Dies führte dazu, dass die CPU-Auslastung fast 30 Sekunden lang auf 100% anstieg, Firefox nicht mehr reagierte und Firefox zusätzliche 2,5 GB Arbeitsspeicher zur Verfügung stellte. Wenn der Computer, den Sie verwenden, nicht viel freien Speicher hat, müsste er auf die Festplatte wechseln. In diesem Fall kann ich mir leicht Szenarien vorstellen, die ernsthafte Usability-Probleme verursachen.

Das Öffnen derselben Datei als einfacher Text war weniger schmerzhaft, aber auch nicht großartig.

Eine Frage, die Sie beantworten müssen, ist, ob es einen triftigen Grund gibt, dass dieses Dokument im Browser angezeigt wird, oder sollte es nur als Download verfügbar sein?

In jedem Fall sollten Sie auch sicherstellen, dass Ihre Webserver-Software Komprimierung für Textdateien anwendet, damit Sie diese Datei mit etwa 10% der sonst benötigten Bandbreite bereitstellen können.

+0

Ich bin mir nicht sicher, ob ich verstehe, was Sie meinen, schlagen Sie vor, ich konvertiere meine Textdatei in einigen HTML-Fil-Format und lassen Sie den Browser direkt öffnen? – Cris

+0

ok das ist ein interessanter Ansatz, ich werde es versuchen und sehen, wie es geht – Cris

+0

Nicht vergessen: *** Überprüfen Sie auch, wie gut der gleiche Browser mit der Anzeige des gleichen Inhalts, wenn es aus dem lokalen Dateisystem geladen wird . *** –