O () tüm dosya ve substr ayrıştırmak için bireysel hat veya fread fseek () fread () kullanmak daha iyidir?

3 Cevap php

Bu daha net yapmak için, ben kod örnekleri koymak için gidiyorum:

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

Orada (belki 15 fseek () ile) yöntemi 1 yaklaşık 40 fread () vardır vs gerçekten sadece belki ayıklanması 100 olduğunuzda 1000000 bayt yükleme overkill ise yönteminde 2 1 fread (). Merak ediyorum tek şey toplam bayt (dosyanın ortasında birlikte tüm nispeten yakın).

Yani hangi kod daha iyi gerçekleştirmek için gidiyor? Hangi kod daha mantıklı kullanmak için yapar? Hızlı bir açıklama duyacağız.

3 Cevap

Zaten aradığınız ofset biliyorum Eğer sadece bu bir kaç bayt gerekiyorsa belleğe tüm dosyayı yüklemek için hiçbir neden yoktur gibi, fseek, burada en iyi yöntemdir. Eğer dosya akışı ne istediğinizi doğru atlayın ve küçük bir kısmını okudum çünkü ilk yöntem daha iyidir. İkinci yöntem belleğe tüm dosya okumak gerekir, o zaman olabilir sırasında sadece dosyadan düz okumak olduğunu yoluyla aramak. Bu sorunuza cevap umuyoruz

Dosyalar kümeler birimlerinde okumak ve bir küme genellikle 8 kb gibi bir şey vardır. Genellikle birkaç kümeleri önde okunur.

Dosya sadece bir kaç kb Yani, eğer tüm dosya okuma ile karşılaştırıldığında fseek kullanarak kazanmak için çok az var. Dosya sistemi zaten tüm dosya okuyacaktır.

Dosya oldukça büyük ise, olduğu gibi, kümelerin sadece birkaç okunacak, bu nedenle ilk yöntem daha iyi yapmalıdır. En kötüsü, tüm veriler hala diskten okunacaktır, ancak uygulama halen daha az bellek kullanır.

Bu istediğiniz pozisyon arayan ve sonra sadece okuma ihtiyacınız bayt iyi yaklaşım olabilir gibi görünüyor.

Ama correct cevap yerine tahmin gerçek için bunu test etmek için (her zaman olduğu gibi) 'dir. Sunucu ortamında iki örnek çalıştırın ve bir süre ölçümleri yapmak. Ayrıca bellek kullanımını kontrol edin. Bunu yedeklemek için bazı somut verilere sahip bir kez Sonra optimizasyon yapmak.