Лучше использовать fseek () fread () в отдельных строках или fread () весь файл и substr для разбора? - PullRequest
2 голосов
/ 02 марта 2010

Чтобы сделать это более понятным, я собираюсь поместить примеры кода:

$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);

В методе 1 есть около 40 fread () (может быть 15 fseek ()) против 1 fread ()в методе 2. Единственное, что мне интересно, это то, что загрузка в 1000000 байт является излишней, если вы действительно извлекаете, может быть, всего 100 байт (все относительно близко друг к другу в середине файла).

код будет работать лучше?Какой код имеет больше смысла использовать?Краткое объяснение будет с благодарностью.

Ответы [ 3 ]

4 голосов
/ 02 марта 2010

Если вы уже знаете смещение, которое вы ищете, fseek - лучший способ здесь, так как нет никакой причины загружать весь файл в память, если вам требуется только несколько байтов. Первый способ лучше, потому что вы пропускаете прямо к тому, что вы хотите в файловом потоке и считываете небольшую часть. Второй метод требует, чтобы вы прочитали весь файл в память, а затем просматривали его, в то время как вы могли просто прочитать его прямо из файла. Надеюсь, что это отвечает на ваш вопрос

3 голосов
/ 02 марта 2010

Файлы читаются в единицах кластеров, а размер кластера обычно составляет около 8 КБ. Обычно несколько кластеров читаются впереди.

Таким образом, если размер файла составляет всего несколько килобайт, использование fseek очень мало по сравнению с чтением всего файла. Файловая система все равно прочитает весь файл.

Если файл значительно больше, как в вашем случае, нужно прочитать только несколько кластеров, поэтому первый метод должен работать лучше. В худшем случае все данные будут по-прежнему считываться с диска, но ваше приложение будет по-прежнему использовать меньше памяти.

1 голос
/ 02 марта 2010

Кажется, что поиск нужной позиции и чтение только тех байтов, которые вам нужны, - лучший подход.

Но правильный ответ (как всегда) состоит в том, чтобы проверить его на самом деле, а не угадывать. Запустите два примера в своей серверной среде и проведите измерения времени. Также проверьте использование памяти. Затем проведите оптимизацию, когда у вас есть надежные данные для резервного копирования.

...