Schrift
[thread]6491[/thread]

Grosse Dateien öffnen: Ohne TIE::File ? (Seite 2)

Leser: 2


<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
Free Faq
 2004-08-13 00:51
#85739 #85739
User since
2003-09-10
141 Artikel
BenutzerIn
[default_avatar]
Ok hab nun ein anderes, wahrscheinlich eher kleineres Problem:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
# 1.gif 206725 Byte
# 2.gif 7795 Byte

open(FILE, "db.sav");
binmode(FILE);
seek(FILE, 206725, 0);
read(FILE, $Data, 7795);
close(FILE);

print "Content-type: image/gif\n\n";
print $Data;

--> Bild wird im Browser nur Teilweise, bis kaputt dargestellt.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1.gif 206725 Byte
# 2.gif 7795 Byte

open(FILE, "db.sav");
binmode(FILE);
seek(FILE, 206725, 0);
read(FILE, $Data, 7795);
close(FILE);

print "Content-type: image/gif\n\n";
open(FILE, "> 123.gif");
binmode(FILE);
print FILE $Data;
close(FILE);

--> Bild ist iO!

Nun hab ich mir die beiden Bilder (iO und Defekt(Ausm Browser per speichern unter gespeichert)) mit dem Editor angeguckt und mir viel auf, das im defekten zwar alle Angaben richtig sind, aber einige Zeilenumbrüche drin sind, die da nicht hingehören. Woran liegt das?
Muss ich bei der Ausgabe im Browser $Data noch irgendwie formatieren? Mit "pack" vielleicht?
Haut mich nicht, ich bin ein Noob!
[E|B]
 2004-08-13 00:55
#85740 #85740
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wo ist binmode(STDOUT)?
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
Free Faq
 2004-08-13 01:05
#85741 #85741
User since
2003-09-10
141 Artikel
BenutzerIn
[default_avatar]
[E|B
,12.08.2004, 22:55]Wo ist binmode(STDOUT)?

Ou bin ich plöt! Voll vergessen =)
Super jetzt tut alles!
Nun bin ich glücklich und kann ruhig schlafen gehen - THX@ALL!
Haut mich nicht, ich bin ein Noob!
Ishka
 2004-08-13 04:42
#85742 #85742
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[E|B
,12.08.2004, 22:17]
Quote
Nebenbei: wenn du die Datei zeilenweise bearbeiten willst, dann die datei nicht mit foreach (<FH>) durchackern, sondern besser mit while (<FH>)...


Wo liegt da genau der Unterschied?

foreach (<FH>) liest die ganze Datei in ein Array und geht dann das Array Elementweise durch, weist das aktuelle Element immer $_ durch. Nachteil: Die ganze Datei muß gleichzeitig im Speicher behalten werden.

while (<FH>) liest die Datei Zeilenweise und speichert die aktuelle Zeile in $_, Eigentlich liest es die Datei immer blockweise, schreibt aber nur die aktuelle Zeile in $_. Nachteil: Aufgrund eines Bugs ist zumindestens bis 5.6 danach $_ leer ;)
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
ptk
 2004-08-13 16:35
#85743 #85743
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Strat,12.08.2004, 21:50][quote=ptk,12.08.2004, 20:41]Bei richtig grossen Dateien ist Tie::File sowieso nicht zu empfehlen.[/quote]
da hatte ich bisher noch keine probleme (allerdings hatte ich da noch keine groesseren als so ca 500MB) ... nur muss man halt ein bisschen aufpassen, dass man damit keine operationen macht, die die komplette datei in den speicher lesen (ich glaube, bei grep, map usw. ist das der fall)[/quote]
Meine Dateien waren "nur" um die 15MB gross. Am Ende dieser Datei kamen periodisch neue Daten dazu. Ich habe nun Tie::File verwendet und einfach eine Schleife for(my $i = $#file; $i>=0; $i--) { ... } gemacht, um die Anfangszeile der neu dazugekommenen Daten festzustellen. Leider liest Tie::File *immer* die gesamte Datei ein, so dass es relativ lange gedauert hat, auch wenn nur ganz wenig oder gar keine neuen Daten dazugekommen sind. Nach dem Umsteigen auf File::ReadBackwards ist die Performance ertraeglich geworden.

Tie::File ist ganz nett, wenn man kleine Dateien hat, oder nicht auf Performance achten muss, oder einfach nur faul ist :-)
pq
 2004-08-13 17:00
#85744 #85744
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=Free Faq,12.08.2004, 20:06]Mein Server hat einige TIE Module (Array, hash,...), aber kein TIE::File :-([/quote]
nur als nachtrag: bist du sicher, dass das modul nicht da ist? es
heißt Tie::File und nicht TIE::File. (frage nur, um sicherzugehen,
man weiß ja nie)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Free Faq
 2004-08-13 20:49
#85745 #85745
User since
2003-09-10
141 Artikel
BenutzerIn
[default_avatar]
Ne ist leider nicht dabei.
Soll mir nun auch egal sein, da ich ja jetzt das habe, was ich wollte :-)
Ausser jemand überzeugt mich mit guten Argumenten, das ich was anderes nehmen soll.

Bisher hatte ich wenigstens einen Ansatz - zum suchen, aber jetzt hab ich keine Ahnung, wo nach ich suchen soll, wenn ich grosse Dateien ändern (editieren) will. Also so wie oben, das ich sage:
ändere Byte x - Byte y mit den neuen Daten z Wobei z nicht die gleiche Bytelänge haben muss wie die Bytelänge zwischen y und x.
Kennt ihr da was?
Haut mich nicht, ich bin ein Noob!
ptk
 2004-08-13 21:38
#85746 #85746
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Haendisch: Daten bis zur Position x in eine neue Datei kopieren, z in neue Datei kopieren, Seek in der alten Datei zur Position y und den Rest in die neue Datei kopieren. Wenn du fertig bist, musst du ein rename von der neuen Datei zur alten Datei machen.

Ohne temporaere Datei geht es nur, wenn du die Daten hinter Position y in den Speicher einliest.

EDIT: Tie::File-Hinweis entfernt.\n\n

<!--EDIT|ptk|1092418731-->
murphy
 2004-08-13 21:39
#85747 #85747
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Eine Frage am Rande:
Gibt's in Perl ein Interface zum mmap System Call? Den finde ich nämlich immer sehr praktisch -- und es wundert mich eigentlich, warum so etwas wie Tie::File ihn nicht verwendet...
When C++ is your hammer, every problem looks like your thumb.
ptk
 2004-08-13 23:52
#85748 #85748
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Das CPAN kennt einige mmap-Module. PerlIO kennt den Layer :mmap, bei dem statt mmap statt open/read/close verwendet wird. In der Praxis erwarte ich aber keine Performancevorteile bei der Verwendung von :mmap in normalen Perl-Programmen.

Tie::File kann Sachen, die man mit mmap auch nicht effizienter loesen kann. Z.B. kann man mit Tie::File Zeilen loeschen, vorhandene Zeilen mit laengeren oder kuerzeren Daten ersetzen, oder Zeilen einfuegen. In all diesen Faellen waere bei der Verwendung von mmap aufwaendiges Kopieren notwendig. Auch muesste der Flaschenhals von Tie::File, naemlich das Durchgehen der gesamten Datei zum Ermitteln der Seek-Positionen der einzelnen Zeilen auch mit mmap gemacht werden.
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



View all threads created 2004-08-12 22:06.