Raku içinde wc -l taklit etmek


9

Perl 5'te, wc -loneliner kullanarak taklit edebilirsiniz :

perl -lnE 'END {say $.}' test.txt

Raku üzerinde bu işlev nasıl uygulanır

Bunu uygulamaya çalışırsanız:

raku -e 'say "test.txt".IO.open.lines.elems'

yavaş olduğu ortaya çıkıyor ve çok fazla bellek kullanıyor

Çoğaltma bilgileri:

$ wget http://eforexcel.com/wp/wp-content/uploads/2017/07/1500000%20Sales%20Records.zip
$ unzip "1500000 Sales Records.zip"
$ mv "1500000 Sales Records.csv" part.txt
$ for i in `seq 1 10`; do cat part.txt >> test.txt ; done
$ du -sh test.txt
1.8G    test.txt

$ time wc -l test.txt
15000000 test.txt

real    0m0,350s
user    0m0,143s
sys     0m0,205s

$ time perl -lnE 'END { say $. }' test.txt
15000001

real    0m1,981s
user    0m1,719s
sys     0m0,256s

$ time raku -e 'say "test.txt".IO.open.lines.elems'
15000001

real    2m51,852s
user    0m25,129s
sys     0m6,378s

# Using swap (maximum uses 2.2G swap):
# Before `raku -e ''`

$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15009        1695       12604         107         708       12917
Swap:          7583           0        7583

# After `raku -e ''`

$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15009         752       13923          72         332       13899
Swap:          7583         779        6804

# Swap not used
$ time raku -ne '++$ andthen END .say' test.txt
15000001

real    1m44,906s
user    2m14,165s
sys     0m0,653s

$ raku -v
This is Rakudo version 2019.11 built on MoarVM version 2019.11
implementing Perl 6.d.

3
Zamanlama bilgilerini ve gerçek çıktısını wc(dosya boyutunu içermelidir) ekleyebilir misiniz? Teşekkür ederim.
Elizabeth Mattijsen

Güncelleme sorusu - üreme için örnek eklendi
TheAthlete

2
@TheAthlete Eklenen bilgiler için teşekkürler. Bence bu, önümüzdeki yıllarda performans aralığının tahmin edilebilir şekilde sürekli kapanması nedeniyle bunun tarihsel olarak ilginç bir [raku] SO olacağını düşünüyorum, bu yüzden lütfen birkaç bilgi daha eklemeyi düşünün. İlk olarak, son zamanlarda bir rakudo kullandığınız açık olsa da (çünkü yazıyorsunuz raku) raku -vçıktıya sahip olmak yine de iyi olacaktır . Ayrıca, mevcut önerimin zamanlamasının çıktısını eklemeyi de düşünün. Ayrıca, 'ascii'daha iyi bir zaman üretmek için bu hafta sonu kod çözücüye geçmeyi düşünebilirim .
raiph

1
Bir yan not: -lperl bayrağı perl'i önemli ölçüde yavaşlatır ve bu durumda yararlı değildir. Makinemde rastgele satır uzunluğu ve yaklaşık 200k satır içeren bir dosya için -lsonuçları% 40 iyileştirmeyle kaldırıyoruz .
Sorin

Yanıtlar:


8

Buna kıyasla hala oldukça yavaş olan perlancak karşılaştırmaya değer bir seçenek :

raku -ne '++$ andthen END .say' test.txt

lKomut satırı seçeneği gereksiz olduğunu.

$ anonim bir durum skaleridir.

andthenlhs değerinin tanımlandığını test eder ve eğer öyleyse, bu değeri topic ( $_) olarak ayarlar ve ardından rh'lerini değerlendirir.

ENDperl's benzer END. Bunun geri döndüğünü Nil, andthenancak burada önemli olmadığını unutmayın çünkü ENDyan etkisi için 'ifadesini kullanıyoruz .

Birkaç şey bu kodun hızını etkileyecektir. Düşünebileceğim bazı şeyler:

  • Derleyici başlatma yükü. Kullanılan modülleri göz ardı eden rakuRakudo derleyicisi, tipik bir donanım için saniyenin onda biri kadar başlangıç ​​yüküne sahiptir perl.

  • Bir "çizgi" kavramı. 'De perl, varsayılan satır işleme kavramı, bazıları bir satır sonunu temsil eden bir bayt dizisini okumaktır. 'De raku, varsayılan satır işleme kavramı, bazıları satır sonlarını temsil eden bir UTF-8 dizesi okumaktır. Bu perlyüzden sadece bir ASCII (veya Genişletilmiş ASCII) kod çözücüsünün rakuokuma yükünü, UTF-8 kod çözücüsünün okuma yükünü üstlenir.

  • Derleyici optimizasyonları. perlgenellikle maks. perl -lnE 'END {say $.}' test.txtBazı akıllı optimizasyonlardan faydalanırsa beni şaşırtmaz . Aksine, Rakudo optimizasyonu çalışmaları hala ilk günlerinde nispeten konuşmaktadır.

Yukarıda bahsettiğim üç noktanın ilki ve sonuncusu hakkında herkesin yapabileceğini düşündüğüm tek şey N yıl beklemek ve / veya derleyicinin gelişimine katkıda bulunmaktır.

Varsayılan olarak raku'nun UTF-8'i üzerinde çalışmanın bir yolu olacaktır. Belki de aşağıdakine benzer bir şey zaten yapılabilir ve raku'nun varsayılanından önemli ölçüde daha hızlıdır, en azından denilen bir modülü kullanmanın yükünü göz ardı eder foo:

raku -Mfoo -ne '++$ andthen END .say' test.txt

Burada modül foo, dosya G / Ç için varsayılan kodlamayı ASCII'ye veya mevcut kodlamalardan herhangi birine çevirir .

Bunun şu anki Rakudo'da yapılabileceğini kontrol etmedim ama olmasaydı şaşırırdım.

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.