Wie speichere ich beim Lesen einer Datei in PHP?

7

Ich habe eine 200kb-Datei, die ich auf mehreren Seiten verwende, aber auf jeder Seite brauche ich nur 1-2 Zeilen dieser Datei, also wie kann ich nur diese Zeilen lesen, was ich brauche, wenn ich die Zeilennummer kenne?

Wenn ich zum Beispiel nur die zehnte Zeile benötige, möchte ich nicht alle Zeilen in den Speicher laden, nur die zehnte Zeile.

Sorry für mein schlechtes Englisch!

    
coolboycsaba 08.04.2010, 22:13
quelle

7 Antworten

3

Wenn Sie den Offset der Linie nicht kennen, müssen Sie jede Zeile bis zu diesem Punkt lesen. Sie können die alten Zeilen (die Sie nicht möchten) einfach wegwerfen, indem Sie die Datei mit etwas wie fgets() durchlaufen. (BEARBEITEN: Statt fgets() würde ich @Gordon vorschlagen, Lösung )

Vielleicht wäre eine bessere Lösung, eine Datenbank zu verwenden, da die Datenbank-Engine das Grunzen der Speicherung der Strings übernimmt und es Ihnen (sehr effizient) ermöglicht, eine bestimmte "Zeile" zu erhalten (Es wäre keine Zeile, sondern ein Datensatz mit einer numerischen ID, aber es ist das gleiche), ohne die Datensätze davor lesen zu müssen.

    
Yacoby 08.04.2010, 22:17
quelle
19

Probieren Sie SplFileObject

aus %Vor%

Für die Ausgabe der aktuellen Zeile können Sie entweder current() oder nur echo $file verwenden. Ich finde es jedoch klarer, die Methode zu verwenden. Sie können auch fgets() verwenden, aber das würde die nächste Zeile bekommen.

Natürlich brauchen Sie nur die mittleren drei Zeilen. Ich habe die memory_get_usage -Aufrufe hinzugefügt, nur um zu beweisen, dass dieser Ansatz fast keine Speicher verbraucht.

    
Gordon 08.04.2010 22:35
quelle
2

Ändert sich der Inhalt der Datei? Wenn es statisch oder relativ statisch ist, können Sie eine Liste von Offsets erstellen, in denen Sie Ihre Daten lesen möchten. Zum Beispiel, wenn sich die Datei einmal im Jahr ändert, aber Sie lesen es hunderte Male am Tag, dann können Sie die Offsets der gewünschten Zeilen vorberechnen und direkt zu ihnen springen:

%Vor%

und so weiter. Danach kannst du so einfach zum Ort dieser Zeile springen:

%Vor%

Aber das könnte völlig übertrieben sein. Versuchen Sie, die Operationen zu vergleichen - vergleichen Sie, wie lange es dauert, ein altmodisches "20 Zeilen lesen" im Vergleich zu vorberechnen / springen zu machen.

    
Marc B 09.04.2010 02:41
quelle
1
%Vor%     
Ivo Sabev 08.04.2010 22:20
quelle
0

Durchlaufen Sie sie einfach, ohne sie zu speichern, z. B.

%Vor%

Das obige Beispiel würde Speicher nur für die letzte Zeile behalten, die es aus der Datei bekommen hat, also ist dies der speichereffizienteste Weg, dies zu tun.

    
bisko 08.04.2010 22:17
quelle
0

Verwenden Sie fgets () . 10 mal :-) In diesem Fall werden Sie nicht alle 10 Zeilen im Speicher speichern

    
zerkms 08.04.2010 22:17
quelle
0

Warum versuchen Sie nur die ersten zehn Zeilen zu laden? Weißt du, dass das Laden all dieser Zeilen tatsächlich ein Problem ist?

Wenn Sie nicht gemessen haben, dann wissen Sie nicht, dass es ein Problem ist. Verschwenden Sie Ihre Zeit nicht für Nicht-Probleme zu optimieren. Es besteht die Möglichkeit, dass jede Leistungsänderung, die Sie beim Laden der gesamten 200-KB-Datei vornehmen, nicht wahrnehmbar ist, es sei denn, Sie wissen, dass das Laden dieser Datei tatsächlich ein Flaschenhals ist.

    
Andy Lester 08.04.2010 22:55
quelle

Tags und Links