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

  • Awesome Toys TV

    Awesome Toys

    18 HAZİRAN 2014
  • celebrateubuntu

    celebrateubu

    23 Mayıs 2011
  • ThisWeekYT

    ThisWeekYT

    14 Mart 2013