Raku에서 WC -L을 에뮬레이트하는 방법


9

perl 5에서는 wc -loneliner를 사용하여 에뮬레이션 할 수 있습니다 .

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

Raku에서이 기능을 구현하는 방법

이것을 구현하려고하면 :

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

속도가 느리고 많은 메모리를 사용합니다.

재생산을위한 정보 :

$ 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
타이밍 정보 및 실제 출력 wc(파일 크기 포함) 을 추가 할 수 있습니까 ? 감사합니다.
Elizabeth Mattijsen

질문 업데이트-재생 예제 추가
TheAthlete

2
@TheAthlete 추가 된 정보에 감사드립니다. 앞으로 몇 년 동안 rakudo의 성능 격차가 꾸준히 폐쇄되고 있기 때문에 이것이 역사적으로 흥미로운 [raku] SO 일 것으로 생각됩니다. 따라서 몇 가지 정보를 더 추가해보십시오. 첫째, 최근의 rakudo를 사용하고 있다는 것이 분명하지만 (쓰기 때문에 raku) 여전히 raku -v출력을 얻는 것이 좋습니다 . 또한 현재 제안 타이밍 출력을 추가하는 것을 고려하십시오. 또한 'ascii'이번 주말에 더 좋은 시간을 만들기 위해 디코더 로 전환하는 것을 고려할 수 있습니다.
라이프

1
참고 사항 : -lperl에 대한 플래그는 perl을 크게 느리게 하며이 경우 유용하지 않습니다. 내 컴퓨터에서 임의의 줄 길이와 약 200k 줄의 파일을 제거 -l하면 결과가 40 % 향상됩니다.
Sorin

답변:


8

여전히 느리지 만 비교할 perl가치가 있는 옵션 중 하나입니다 .

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

l명령 줄 옵션은 중복입니다.

$ 익명 상태 스칼라입니다.

andthenlh가 정의되어 있는지 테스트하고, 해당하는 경우 해당 값을 주제 ( $_) 로 설정 한 다음 rhs를 평가합니다.

END유사하다 perl의 ' END. 이 반환 참고 Nil받는 사람 andthen하지만 우리가 사용하고 있기 때문에 그것이 여기에 문제가되지 않는 END측면 효과에 대한의 문.

이 코드의 속도에 영향을주는 몇 가지 사항이 있습니다. 내가 생각할 수있는 것 :

  • 컴파일러 시작 오버 헤드 사용되는 모든 모듈을 무시하고 raku컴파일러 Rakudo는 일반적인 하드웨어에서 시작시 오버 헤드가 10 분의 1 초로 매우 무시할 정도입니다 perl.

  • "라인"의 개념. 에서 perl라인 처리의 기본 개념은 일련의 바이트를 읽는 것으로, 일부는 라인 끝을 나타냅니다. 에서 raku라인 처리의 기본 개념은 UTF-8 문자열을 읽는 것입니다.이 중 일부는 라인 끝을 나타냅니다. 따라서 perlASCII (또는 확장 ASCII) 디코더 raku의 읽기 오버 헤드 만 발생하는 반면 UTF-8 디코더의 읽기 오버 헤드는 발생합니다.

  • 컴파일러 최적화. perl일반적으로 최대에 최적화됩니다. perl -lnE 'END {say $.}' test.txt영리한 최적화를 활용 하더라도 놀라지 않을 것 입니다. 대조적으로, Rakudo 최적화에 대한 연구는 여전히 초기 단계에 있습니다.

위에서 언급 한 세 가지 포인트 중 첫 번째와 마지막에 대해 누구나 할 수 있다고 생각하는 것은 N 년을 기다리거나 컴파일러의 개선에 기여하는 것입니다.

기본적으로 raku의 UTF-8을 해결하는 방법이 있습니다. 아마도 다음과 같은 것이 raku의 기본값보다 이미 실행 가능하고 상당히 빠르며, 적어도 다음과 같은 모듈을 사용하는 오버 헤드는 무시합니다 foo.

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

여기서 module foo은 파일 I / O의 기본 인코딩을 ASCII 또는 사용 가능한 인코딩 중 무엇이든 전환합니다 .

나는 이것이 현재 Rakudo에서 실제로 가능한지 확인하지는 않았지만 놀랐을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.