Ist es besser, Verwendung fseek () fread () auf einzelnen Linien oder fread () die gesamte Datei und substr zu analysieren?

StackOverflow https://stackoverflow.com/questions/2364395

Frage

Um dies deutlich zu machen, werde ich Code-Beispiele setzen:

$file = fopen('filename.ext', 'rb');

// Assume $pos has been declared
// method 1
fseek($file, $pos);
$parsed = fread($file, 2);

// method 2
while (!feof($file)) {
    $data = fread($file, 1000000);
}

$data = bin2hex($data);
$parsed = substr($data, $pos, 2);

$fclose($file);

Es gibt etwa 40 fread () in Verfahren 1 (mit vielleicht 15 fseek ()) vs 1 fread () in Methode 2. Das einzige, was ich frage mich, wenn Laden in 1000000 Bytes Overkill ist, wenn Sie wirklich nur sind vielleicht insgesamt 100 Bytes (alle relativ nahe beieinander in der Mitte der Datei) zu extrahieren.

Also, welcher Code wird besser durchführen? Welcher Code macht mehr Sinn zu benutzen? Eine kurze Erklärung würde sehr geschätzt werden.

War es hilfreich?

Lösung

Wenn Sie bereits wissen, dass die Offset Sie suchen, fseek ist die beste Methode, die hier, da es keinen Grund gibt, die gesamte Datei in den Speicher zu laden, wenn Sie nur ein paar Bytes benötigen. Die erste Methode ist besser, weil man direkt überspringen, was Sie in den Datei-Stream wollen und einen kleinen Teil ausgelesen. Die zweite Methode erfordert, dass Sie die gesamte Datei in dem Speicher zu lesen, dann sucht durch, dass, während Sie es gerade aus der Datei gerade gelesen haben könnten. Hope this beantwortet Ihre Frage

Andere Tipps

Die Dateien werden in Einheiten von Clustern zu lesen, und ein Cluster ist in der Regel so etwas wie 8 kb. Normalerweise ein paar Cluster lesen vor.

Also, wenn die Datei nur ein paar kb gibt es sehr wenig von gewinnen fseek mit im Vergleich zu der gesamten Datei zu lesen. Das Dateisystem wird auf jeden Fall die gesamte Datei lesen.

Wenn die Datei erheblich größer, wie in Ihrem Fall ist, nur ein paar des Cluster muss gelesen werden, so dass das erste Verfahren besser durchführen soll. Im schlimmsten Fall alle werden die Daten noch von der Platte gelesen werden, aber Ihre Anwendung wird noch wenige Speicher belegt werden.

Es scheint, dass die Position suchen Sie wollen, und dann liest nur sein Bytes, die Sie brauchen, ist der beste Ansatz.

Aber die richtig Antwort ist (wie immer) zu testen für echte statt erraten. Führen Sie zwei Beispiele in der Serverumgebung und einige Zeitmessungen durchzuführen. Überprüfen Sie auch die Speichernutzung. machen Sie Ihre Optimierung Dann, wenn Sie einige harte Daten haben es wieder auf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top