Inhalt von Datei auslesen
Pitt
- cgi
hi,
man leute ich komm einfach nicht weiter.
kann mir bitte bitte einer sagen wie ich des machen soll, wenn ich ein verzeichnis habe das ich mit opendir() öffne, wie ich dann z.b. 5 dateien, die sich in diesem verzeichnis befinden auslesen kann.
mit auslesen meine ich aber nicht den namen von den dateien, sondern den inhalt.
weil wenn ich das verzeichnis mit opendir() öffne, und mit readdir auslese, könnte ich ja den inhalt, also den namen von den dateien in einem array speichern und dann die namen in dem array in die open() funktion als pfad reinschreiben, aber da sind immer so drei punkte am anfang dabei.
also müsste ich entweder die drei punkte löschen, oder gleich ohne die drei punkte im array speichern.
bin am verzweifeln, habe schon alles versucht und auch schon fast ganz google durchsucht, kann aber nichts darüber finden.
vielen dank im voraus.
hallo,
mit auslesen meine ich aber nicht den namen von den dateien, sondern den inhalt.
Naja, das ist nicht so ganz leicht - du hast "CGI" als Thema gewählt, also meinst du möglicherwiese nicht PHP, sondern bist eventuell mit PERL unterwegs - es käme aber auch noch anderes in Frage.
Bei PERL geht das so:
open(SEITE,"$seite") || die $!;
@seite = <SEITE>;
close(SEITE);
"$seite" ist eine Variable für den Namen der gewünschten Datei. Danach hast du alles in @seite drin und kannst es mit
foreach $zeile (@seite)
nach Belieben weiterverarbeiten.
Christoph S.
hallo,
mit auslesen meine ich aber nicht den namen von den dateien, sondern den inhalt.
Naja, das ist nicht so ganz leicht - du hast "CGI" als Thema gewählt, also meinst du möglicherwiese nicht PHP, sondern bist eventuell mit PERL unterwegs - es käme aber auch noch anderes in Frage.
Bei PERL geht das so:
Eher bei Perl, nicht bei PERL
open(SEITE,"$seite") || die $!;
perldoc -q quoting.*vars
@seite = <SEITE>;
close(SEITE);"$seite" ist eine Variable für den Namen der gewünschten Datei. Danach hast du alles in @seite drin und kannst es mit
foreach $zeile (@seite)
nach Belieben weiterverarbeiten.
besser (=weniger Speicherzehrend) wäre natürlich ein:
while( defined( local $_ = <SEITE> )){
#...
}
Weil dann nicht die komplette Datei in den armen Hauptspeicher geladen werden müsste.
hi,
besser (=weniger Speicherzehrend) wäre natürlich ein:
while( defined( local $_ = <SEITE> )){
#...
}
hm. Das funktioniert natürlich auch ganz gut. Aber deine Begründung:
Weil dann nicht die komplette Datei in den armen Hauptspeicher geladen werden müsste.
kriege ich noch nicht ganz auf die Reihe ("perldoc" kann ich natürlich lesen und zu einem sehr großen Teil wahrscheinlich auch verstehen).
Grüße aus Berlin
Christoph S.
hi!
Weil dann nicht die komplette Datei in den armen Hauptspeicher
geladen werden müsste.
kriege ich noch nicht ganz auf die Reihe ("perldoc" kann ich
natürlich lesen und zu einem sehr großen Teil wahrscheinlich auch
verstehen).
=== cut ===
@seite = <SEITE>;
=== cut ===
Ganze Datei wird in Array gelesen. Array ist ein Speicherbereich.
Also: ganze Datei liegt im Speicher.
bye, Frank!
hallo Frank,
=== cut ===
@seite = <SEITE>;
=== cut ===
Ganze Datei wird in Array gelesen. Array ist ein Speicherbereich.
Also: ganze Datei liegt im Speicher.
Jaja, das ist mir schon klar. Ich hätte deutlicher nachfragen sollen: Welchen Unterschied macht es, ob ich die "ganze Seite" auf einen Rutsch in den Speicher stopfe oder ob ich sie halt "Zeile für Zeile" in einzelnen Häppchen reinschiebe und dafür häufiger zugreifen muß?
Grüße aus Berlin
Christoph S.
Hi,
Jaja, das ist mir schon klar. Ich hätte deutlicher nachfragen sollen: Welchen Unterschied macht es, ob ich die "ganze Seite" auf einen Rutsch in den Speicher stopfe oder ob ich sie halt "Zeile für Zeile" in einzelnen Häppchen reinschiebe und dafür häufiger zugreifen muß?
Machen wir es jetzt mal ein wenig übertrieben, um es deutlicher zu machen. Sagen wir, du hast eine/mehrere Textdateien mit einer Größe 100 MB (z.B. bei der Selfsuche). Diese musst du nun bei jedem Aufruf des Scriptes, egal ob lokal oder übers Netz, ganz durchsuchen.
Wenn wir jetzt die Datei ganz in ein Array laden kann erstens erst mit der Verarbeitung angefangen werden, wenn die Datei ganz eingelesen ist, zweitens haben wir dann mehr als 100MB Arbeitsspeicher belegt. Dass ist nicht wirklich effektiv. Daher ist es besser nur einen Teil, zum Beispiel eine Linie, das kann aber auch eine bestimmte Anzahl an Bytes sein, einzulesen, und zu verarbeiten. Auf diese Weise braucht man wesentlich weniger Arbeitsspeicher. Das Script wird dadurch, bei den Geschwindigkeiten von aktuellen Festplatten oder noch besser Festplattenverbänden, nicht langsamer.
Grüße Andres Freund
hallo Andres,
Das Script wird dadurch, bei den Geschwindigkeiten von aktuellen Festplatten oder noch besser Festplattenverbänden, nicht langsamer.
Die Umdrehungsgeschwindigkeit einer Platte hat mit Zugriffszeiten auf den Speicher nichts zu tun. Wichtig ist in dem Fall eher, wie schnell die CPU arbeiten kann.
Ich habe jetzt mal zu Vergleichszwecken eine 60 MB große HTML-Datei auf beide Arten "ausgelesen" - auf meinem 6 Jahre alten Rechner mit 90 MB RAM und 166 MHz. Da gibt es tatsächlich signifikante Unterschiede.
Ok, du hast recht, so einen "unterversorgten" Rechner trifft man nirgends mehr als Server im Internet an. Ich habe halt gerade bei PERL etwas Mühe, mich zu "modernisieren", weil ich immer erst bei solchen Themen wie hier im Thread merke, daß ich noch (teilweise sehr) alte Gewohnheiten mit mir schleppe, die irgendwann mal vor Jahren völlig ausreichend waren.
Wer heute neu anfängt, ist aufgrund der höheren Leistungsfähigkeit der modernen Rechner deutlich im Vorteil und muß nicht gelegentlich überprüfen, ob das, was man ehemals gelernt hat, noch in allen Bereichen gültig ist.
Grüße aus Berlin
Christoph S.
Hi,
Die Umdrehungsgeschwindigkeit einer Platte hat mit Zugriffszeiten auf den Speicher nichts zu tun. Wichtig ist in dem Fall eher, wie schnell die CPU arbeiten kann.
Habe ich das irgendwo gesagt? Ich habe mich darauf bezogen, dass du gesagt hasst, dass durch das schrittweise Lesen langsamer wird.
Was auch noch wichtig sein dürfte, ist der Cache der Platte, aber das ist jetzt eigentlich egal.
Ich habe jetzt mal zu Vergleichszwecken eine 60 MB große HTML-Datei auf beide Arten "ausgelesen" - auf meinem 6 Jahre alten Rechner mit 90 MB RAM und 166 MHz. Da gibt es tatsächlich signifikante Unterschiede.
In welcher Form waren die Unterschiede, dass lässt sich aus deinen Sätzen nicht erkennen. Würd mich interessieren.
Ok, du hast recht, so einen "unterversorgten" Rechner trifft man nirgends mehr als Server im Internet an. Ich habe halt gerade bei PERL etwas Mühe, mich zu "modernisieren", weil ich immer erst bei solchen Themen wie hier im Thread merke, daß ich noch (teilweise sehr) alte Gewohnheiten mit mir schleppe, die irgendwann mal vor Jahren völlig ausreichend waren.
Hm, ich glaube nicht, dass es irgendwann einmal, bei einem Programm dass speicherschonend und schnell ablaufen sollte, sinvoll war, eine Datei gleich ganz in den Speicher zu lesen.
Sicherlich ist das auslesen an einem Stück bei genügend Ram schneller. Die Sache ist aber die, dass die Verarbeitung der Daten meistens wesentlich länger braucht, als das bloße auslesen. Daher ist es unnötig etwas in den Ram zu laden, was erst in 5 Sekunden benötigt wird. Ausserdem hat diese Methode den Vorteil, nicht gleich den ganzen Ram zu belegen, was bei einem System, bei dem mehrere Programme gleichzeitig laufen nützlich ist.
Wer heute neu anfängt, ist aufgrund der höheren Leistungsfähigkeit der modernen Rechner deutlich im Vorteil und muß nicht gelegentlich überprüfen, ob das, was man ehemals gelernt hat, noch in allen Bereichen gültig ist.
Den ersten Kontakt hatte ich mit einem Computer mit 33MHZ und DOS (Welche Version weiß ich nicht mehr). Später hatten wir dann einen PC mit 100 MHZ und Windows 3.11 wodrauf später win98 lief. Also habe ich auch schon mit Rechnern mit vergleichsweise wenig Rechenleistung gearbeitet.
Grüße
Andres Freund
hi!
Das Script wird dadurch, bei den Geschwindigkeiten von aktuellen Festplatten oder noch besser Festplattenverbänden, nicht langsamer.
Die Umdrehungsgeschwindigkeit einer Platte hat mit Zugriffszeiten
auf den Speicher nichts zu tun. Wichtig ist in dem Fall eher, wie
schnell die CPU arbeiten kann.
Das ist übrigens Quatsch. Kein Hauptspeicher kommt heutzutage an die
Geschwindigkeit der CPU heran.
bye, Frank!
Halihallo Christoph
Ganze Datei wird in Array gelesen. Array ist ein Speicherbereich.
Also: ganze Datei liegt im Speicher.
Jaja, das ist mir schon klar. Ich hätte deutlicher nachfragen sollen: Welchen Unterschied macht es, ob ich die "ganze Seite" auf einen Rutsch in den Speicher stopfe oder ob ich sie halt "Zeile für Zeile" in einzelnen Häppchen reinschiebe und dafür häufiger zugreifen muß?
Es sind IMHO nicht mehr Zugriffe nötig. Der Zugriff geht über PerlIO, dann zu libc und
dann auf die Systemroutinen. Letztere und zweitletztere cachen die Daten, nicht zuletzt,
weil der atomare Zugriff gleich ca. 1024 Bytes auf's mal einliest. Ob nun alle
1024-Byte chunks sequentiell ohne grosse Verzögerung eingelesen werden oder eben mit
etwas Verzögerung spielt in den _meisten_ Fällen keine Rolle.
Zugegeben, in einer Multitakting Umgebung konkurrieren die Zugriffe und der Lesekopf
müsste dann von einem Sektor zum gegenüberliegenden gejagt werden (was bei einem
"gleich alles auf einen Zug"-einlesen etwas unwahr).
Aber das nunmal Hauptargument dagegen und das meiner Meinung nach ausschlaggebende:
Sind 100MB weniger RAM nicht schlimmer, als einige missratene Lesekopfpositionen??
Als Antwort auf diese rhetorische Frage: Meiner Meinung nach in den meisten Fällen schon,
besonders in Systemen, die unter grosser Last stehen und nicht im Single User Modus
betrieben werden (sprich: die meisten Server im Internet :-)).
Viele Grüsse
Philipp
use Mosche;
weil wenn ich das verzeichnis mit opendir() öffne, und mit readdir auslese, könnte ich ja den inhalt, also den namen von den dateien in einem array speichern und dann die namen in dem array in die open() funktion als pfad reinschreiben, aber da sind immer so drei punkte am anfang dabei.
Vielleicht zur Erklärung, woher diese drei Punkte kommen. Unter Unix-Systemen (und IMHO auch unter DOS) ist . eine Verknüpfung mit dem aktuellen Verzeichnis, und .. eine Verknüpfung mit dem übnergeordneten Verzeichnis. Mit 'cd ..' ist es also zB möglich, eine Verzeichnishierarchie hinaufzukommen.
also müsste ich entweder die drei punkte löschen, oder gleich ohne die drei punkte im array speichern.
Daran wirst du wohl nicht vorbeikommen, den '.' und '..' sind ja Verzeichnisse.
Ich schlage dir allerdings folgendes Verfahren vor:
opendir(DH, $dein_dir) or die $!;
foreach my $file_or_dir (readdir(DH)) {
if (-f $file_or_dir) {
# in $file_or_dir stehen jetzt nacheinander alle Dateien und Verzeichnisse
# aus $dein_dir drin. Mit -f filterst du die Dateien aus. jetzt kannst du
# $file_or_dir öffnen
open(FH, $file_or_dir) or die $!;
# stell was mit <FH> an ...
close(FH);
}
}
closedir(DH);
use Tschoe qw(Matti);