Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10629[/thread]

Dateihandles - Speicherverbrauch



<< >> 8 Einträge, 1 Seite
Oliver_M
 2007-10-22 11:29
#101171 #101171
User since
2005-11-23
19 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habe nur eine Verständnisfrage:
Wenn ich ein Filehandle auf eine Datei öffen, wird diese Datei dann sofort in den Speicher geladen, oder passiert dies erst, wenn ich das Filehandle in ein Array lade?

Vielen Dank schonmal für eure Antworten

Grüße
Olli
bloonix
 2007-10-22 12:50
#101174 #101174
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Wenn du die Datei öffnest, wird noch nichts in den Speicher geladen.

Erst wenn du das Filehandle so ansprichst, dass es dir etwas aus
der Datei liefern soll. Zum Beispiel mit:

Code: (dl )
1
2
3
my $line = <$fh>;
my @lines = <$fh>;
my $lines = do { local $/; <$fh> };
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
nepos
 2007-10-22 12:52
#101175 #101175
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Der Inhalt wird erst dann in den Speicher geholt, wenn du die Daten einliest.
Bei grossen Files benutzt man daher normal die while-Schleife, um die Datei Zeile fuer Zeile einzulesen. Wenn du es so machst:
Code (perl): (dl )
1
2
3
4
open(my $bigfile, '<', '/mein/grosse/datei')
or die "Error opening file: $!";
my @data = <$bigfile>;
close($bigfile);

Liest du die Datei komplett auf einmal in den Speicher...
#Kein Kommentar
 2007-10-22 18:23
#101198 #101198
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
und was ist denn wenn ich die datei, während der verwendung bearbeite?
ist die datei die aus dem handle kommt dann auch bearbeitet?
oder geht das nich?
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
bloonix
 2007-10-22 19:21
#101199 #101199
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Ja, die ist dann auch bearbeitet.

Warum testet ihr das nicht einfach mal? Also...

create.pl
Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl
use strict;
use warnings;

open my $fh, '>', 'foo.txt' or die $!;
for (1..10) {
print $fh "$_ Perl slogan: Easy things should be easy,";
print $fh " and hard things should be possible.\n";
}
close $fh;


read.pl
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl
use strict;
use warnings;

open my $fh, '<', 'foo.txt' or die $!;
seek($fh, 0, 2);
print "File size: ", tell($fh), "\n";
print "Change file and press enter ....\n";
<STDIN>; # jetzt editiere die Datei
seek($fh, 0, 2);
print "New file size: ", tell($fh), "\n\n";
seek($fh, 0, 0);
print <$fh>;
close $fh;


change.pl
Code: (dl )
1
2
3
4
5
6
7
#!/usr/bin/perl
use strict;
use warnings;

open my $fh, '>>', 'foo.txt' or die $!;
print $fh "hello world\n";
close $fh;


Dann wie folgt in zwei Fenstern vorgehen:

1. im ersten Fenster create.pl ausführen, um foo.txt anzulegen
2. im ersten Fenster read.pl ausführen und bei der Eingabeaufforderung warten
3. im zweiten Fenster change.pl ausführen
4. im ersten Fenster "Enter" drücken

und siehe da....

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
File size: 791
Change file and press enter ....

New file size: 803

1 Perl slogan: Easy things should be easy, and hard things should be possible.
2 Perl slogan: Easy things should be easy, and hard things should be possible.
3 Perl slogan: Easy things should be easy, and hard things should be possible.
4 Perl slogan: Easy things should be easy, and hard things should be possible.
5 Perl slogan: Easy things should be easy, and hard things should be possible.
6 Perl slogan: Easy things should be easy, and hard things should be possible.
7 Perl slogan: Easy things should be easy, and hard things should be possible.
8 Perl slogan: Easy things should be easy, and hard things should be possible.
9 Perl slogan: Easy things should be easy, and hard things should be possible.
10 Perl slogan: Easy things should be easy, and hard things should be possible.
hello world
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2007-10-22 19:24
#101200 #101200
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Vorsicht, wenn ihr die Datei mit vim bearbeitet, dann klappt das nicht!
Der Grund ist simple:

Code: (dl )
1
2
#> ls -li foo.txt
1818651 -rw-r----- 1 bloonix bloonix 803 2007-10-22 17:21 foo.txt


nach der Bearbeitung mit vim
Code: (dl )
1
2
#> ls -li foo.txt
1818652 -rw-r----- 1 bloonix bloonix 815 2007-10-22 17:24 foo.txt


Wie das auf Windows ausschaut oder mit anderen Editoren... weiß ich net :-)
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
betterworld
 2007-10-23 00:18
#101204 #101204
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Man muss wissen, dass das Einlesen (insbesondere das zeilenweise Einlesen) gepuffert ist. Das heißt, dass nicht nur eine Zeile aus der Datei gelesen wird, sondern eine "ganze Menge"(TM) (wie viel das genau ist, hängt vom System ab). Davon wird die erste Zeile zurückgegeben. Die nächste Zeile wird dann beim nächsten Aufruf vom "<FILE>" zurückgegeben, wird aber aus dem Speicher geholt und nicht aus der Datei.

Lange Rede, kurzer Sinn: Wegen des Pufferns kann man sich nicht so wirklich darauf verlassen, dass Änderungen in der Datei beim nächsten "<FILE>" bemerkbar sind. Aber im Allgemeinen sind sie es. Aber ausprobiert habe ich es jetzt nicht, ich hab mir das nur so gedacht.
bloonix
 2007-10-23 10:28
#101209 #101209
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
... und sogar richtig gedacht, dabei ist aber zu beachten, dass Perl erst anfängt
zu Puffern, wenn das erste Mal <$fh> aufgerufen wurde. Nach dem open() ist
noch nichts gepuffert. Die Pufferung kann umgangen werden, wenn man mit
seek() arbeitet.

Edit: umgange nicht in dem Sinne, das nicht gepuffert wird, sondern den Puffer
selbst umgehen
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< >> 8 Einträge, 1 Seite



View all threads created 2007-10-22 11:29.