Thread perl upload script: Speicherauslastung (5 answers)
Opened by Gast at 2007-06-29 13:54

Gast Gast
 2007-06-29 13:54
#228 #228
Hallo,

zum upload grosser Video Dateien und wegen einer Verlaufanzeige habe ich mich in perl eingearbeitet. Generell funktioniert das auch, wenn die zu uploadenden Dateien nicht grösser als das hardlimit an Speicherverbrauch für Perl Scripte liegen. Eigentlich klar könnte man denken. Ziel ist es, dass das Perl script möglichst wenig Speicher verbraucht. Der upload an sich erfüllt diese Bedingung. Hier wird das STDIN (post raw data) mit einer while Schleife in 4 kb grossen Stücken in eine Datei gestreamt. Somit habe ich z.B. eine 700 MB grosse Datei hochgeladen, obwohl das hard limit bei 200 MB liegt. Die Datei wird ja nicht komplett angefasst.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
open(FH,">","$post_data_file");

$ofh = select(FH); $| = 1; select ($ofh);

while (read (STDIN ,$LINE, 4096) && $b_read < $len )
{
if (-e "$exit_file") { unlink ("$exit_file"); exit;}

$b_read += length $LINE;

select(undef, undef, undef,0.01);

print FH $LINE;
}


Jetzt zum eigentlichen Problem. Ich habe die post raw data als Datei auf dem Server abgelegt. Nun ist der nächste Schritt die eigentlich upgeloadete Datei in der post raw data Datei wieder zufinden. Genau hier ist das Problem. Das perl script muss scheinbar die gesamte Datei in den Arbeitsspeicher laden um die Elemente anzusprechen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
close(STDIN);
open(STDIN,"$post_data_file") or &_bye("Upload fehlgeschlagen");

my $cgi = new CGI();
my $assign = "";
my %vars = $cgi->Vars;

while(($key,$value) = each %vars)
{
if(defined $value && $value ne '')
{
my $fh = $cgi->upload($key);

binmode ($fh);

if(defined $fh)
{
...


Gibt es vielleicht eine Möglichkeit die upgelodete Datei speicherschonend aus der post raw data zu ziehen?

edit pq: code-tags hinzugefügt\n\n

<!--EDIT|pq|1183124349-->

View full thread perl upload script: Speicherauslastung