Wc -l nasıl çalışır?


11

Ben büyük bir dosyayı okumak zorunda ve ben okumaya başlamadan önce, dosya (toplam milyonlarca) satır sayısını bilmek gerekir.

Birçok çözüm uyguladım ve bir çözüm buldum. Ama arama sırasında nasıl wc -lçalıştığına bakmayı düşünüyordum . Google'da hiçbir şey bulamadım.

Sorunuma bir çözüm bulmuş olmama rağmen, wc -lbirkaç saniyede 92 Milyon satırlık bir dosyanın satır sayısını hesaplayabildiğinden hala nasıl çalıştığını bilmek istiyorum !

Nasıl?


Yanıtlar:


20

Tüm dosyayı okur ve satır sonlarını sayar. Satır sonlarını saymak gerçekten ucuz; harcanan çoğu zaman dosyayı okumaktır. Dosya (çoğunlukla) arabellek önbelleğinde olursa, bu da ucuz olacaktır. Aksi takdirde, dosya depolama hızınıza bağlı olacaktır.

Başka bir deyişle, sihir yoktur.


Tüm dosyayı okur ve satır sonlarını sayar? Satır sonunu elde etmek için, sonuna kadar tüm satırı okumaz mı? Bu, tüm dosyayı okuduğu anlamına gelir, değil mi?
detraveller

@detraveller: evet, dediğim gibi tüm dosyayı okuyor. Satır satır veya hepsi aynı anda okumaz, ancak her karakteri okur ve bu karakterlerden kaçının satır sonu karakteri olduğunu sayar.
rici

7

WC yalnızca ham bayt blokları halinde dosyayı okur (dosyanın bulunduğu temel dosya sisteminin doğal blok boyutunun katları olarak tercih edilir).
Sonra sadece satır sonu karakterleri sayarak arabellek tarar. (-L çıktısından başka bilgi istemeniz durumunda boşlukları, sekmeleri, form beslemelerini ve diğer özel karakterleri de sayar.)

Diskten okuma, hız açısından maliyetli bir parçadır. Tamponun taranması, buna kıyasla ihmal edilebilir bir zaman alır.

Diyelim ki satır başına ortalama 100 karakter içeren 90 milyon satırınız var.
Bu yaklaşık 9.000.000.000 karakter veya yaklaşık 860 MB'dir.
SATA-3Gb / s sürücüsüne sahip iyi bir bilgisayar bunu 10 saniyenin altında yapacak. Diğer aktivitelerin aynı anda devam ettiği nispeten yavaş bir dosya sisteminde bile.
Bazı performans ayarlarına ve optimize edilmiş bir dosya sistemine sahip hızlı bir makine, SATA-6G'ye ve bir SSD sürücüye başvurmak zorunda kalmadan bile 5 saniyenin altında bunu yapabilir.


sadece satır sonu ( \n) karakterlerini sayarak arabellek tarar - "-l, --lines satır sonunu yazdırır \ n \" - ayıklanırwc.c
Rahul Patil

@RahulPatil Çoğu uygulama, yeni satırları saymaktan çok daha fazlasını yapar. Yukarıdaki üst yorumda belirtilen örneğe bakın. Linux çekirdek yardımcı programlarında kullanılan wc kaynağı budur.
Tonny

evet .. Ben gördüm .. sadece bahsettiğim için, hakkında soru wc -l... üzgünüm ...
Rahul Patil

3

Özgür yazılım dünyasına hoş geldiniz. Her zaman kaynak koduna bakabilirsiniz

Ben sizin (ve ben gerçekten kodu açıklayabilir biri değilim bu yüzden, bir C programcısı değilim itiraf gerekmesine rağmen ediyorum kendimi insterested bırakılır).

Bildiğim şey, wc dosyasının kendisini açmaması, ancak işletim sisteminden bunu yapmasını istediğinden, bu büyük ölçüde işletim sistemine ve elbette dosyanın nasıl saklandığına bağlıdır. Bunun dışında, doğru programlama uygulamalarının mevcut olmasını beklerim, örneğin dosyayı bir kerede bütün olarak okumaya çalışmaz, vb.


'Dosyanın tamamını bir kerede okumaya çalışmama' diyerek ne demek istiyorsun?
detraveller

Demek istediğim, dosyayı tek bir dizeye / diziye belleğe yüklemek. Perl topluluğunda buna slurping denir ve birkaç satır okuyacağınızı bildiğinizde Tamam olan hızlı ve kirli bir çözümdür , ancak bir kerede gerçekten büyük dosyayı beslemek nadiren iyi bir fikirdir.
Alois Mahdal

1
Öte yandan, 64 KiB okuyabilir, yeni satırları sayabilir ve atabilir, tekrarlayabilirsiniz ... Bu şekilde, dosya ne kadar büyük olursa olsun en fazla 64 KiB üzerinde bir şeyler yiyeceksiniz. (
Newline'ın

Çok önemli değil, ama: "çünkü wc dosyayı kendisi açmaz, ama işletim sisteminden bunu yapmasını ister" - bununla ne demek istediğinden emin değilim, ama bunun doğru olduğundan şüphe ediyorum. Kesinlikle tüm karakterleri tek başına okuyor.
Arjan

2
@Arjan Her ne kadar, gerçekten doğru olmak gerekirse: gömülü sistemler hariç olmak üzere, programlar okumayı neredeyse hiç yapmazlar, Çekirdek ve işletim sisteminin tüm amacı onlar için işi yapmasıdır. Aslında, open (), close (), read () (Linux, Windows, soket veya dosya olsun), gerçek programların iç işler hakkında hiçbir fikri olmadığı sistem çağrılarıdır.
Alois Mahdal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.