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
fgets()
çağrı döngü kullanmak iyi çözüm ve en basit yazmak için, ancak:
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ı.
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
Bir metin dosyası içinde satır sayısın...
Kayıt veya satır içeriği ile yerine Vi...
Nasıl sipariş sonra Oracle bir sorgu t...
Metnin bir terabayt ayrıştırma ve veri...
Nasıl satır sayısını vurgulanan rengin...