SORU
29 Ocak 2010, Cuma


Bir metnin satır sayısını sayma dosyası verimli. (200mb )

Sadece benim senaryom bana ölümcül bir hata verdiğini öğrendim:

Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 440 bytes) in C:\process_txt.php on line 109

Bu satırlar şunlar:

$lines = count(file($path)) - 1;

Zorluk memeory dosya yükleme ve satır sayısını saymak zorunda olduğunu düşünüyorum yani, bellek sorunları olmadan yapamıyorum daha verimli bir yolu var mı?

Metin 500 için 2 MB aralığı için satır sayısını saymak için gereken dosyalar. Bir İş bazen belki.

Tüm herhangi bir yardım için teşekkürler.

CEVAP
12 Aralık 2013, PERŞEMBE


fgets() çağrı döngü kullanmak iyi çözüm ve en basit yazmak için, ancak:

  1. DAHİLİ olarak dosya okuma 8192 bayt tampon kullanıyor olsa bile, kodunuzu hala her satırı için bu işlev çağrısı.

  2. tek bir satırı ikili dosya okuyorsanız kullanılabilir bellekten daha büyük olabilir, ki teknik olarak mümkün değil.

Bu kod 8kB parçaları her bir dosyayı okur ve sonra da bu yığın içinde yeni satır sayısını sayar.

function getLines($file)
{
    $f = fopen($file, 'rb');
    $lines = 0;

    while (!feof($f)) {
        $lines  = substr_count(fread($f, 8192), "\n");
    }

    fclose($f);

    return $lines;
}

Eğer her satırın ortalama uzunluğu en fazla ise 4 KB, zaten işlev çağrıları tasarruf başlar, ve o büyük dosyaları işlemek ekleyebilirsiniz.

Kriter

1GB bir dosya ile test ettim; işte sonuçlar:

              ------------- ------------------ --------- 
             | This answer | Dominic's answer | wc -l   |
 ------------ ------------- ------------------ --------- 
| Lines      | 3550388     | 3550389          | 3550388 |
 ------------ ------------- ------------------ --------- 
| Runtime    | 1.055       | 4.297            | 0.587   |
 ------------ ------------- ------------------ --------- 

Zaman saniye gerçek zamanlı olarak, ne anlama geldiğini here bakın ölçülür

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Arun Kumar

    Arun Kumar

    18 Mart 2010
  • Motor Trend Channel

    Motor Trend

    11 Mart 2006
  • Vintendo Power

    Vintendo Pow

    2 Ocak 2007