Rust Library로 PGN 표기법으로 체스 게임을위한 빠른 비 할당 및 스트리밍 리더.
Reader
사용자가 제공 한 Visitor
의 게임 및 전화 방법을 구문 분석합니다. 맞춤 방문자를 구현하면 최대의 유연성이 가능합니다.
각 게임의 메인 라인에서 구문 적으로 유효한 움직임의 수를 계산하는 방문자.
use std :: io ;
use pgn_reader :: { Visitor , Skip , BufferedReader , SanPlus } ;
struct MoveCounter {
moves : usize ,
}
impl MoveCounter {
fn new ( ) -> MoveCounter {
MoveCounter { moves : 0 }
}
}
impl Visitor for MoveCounter {
type Result = usize ;
fn begin_game ( & mut self ) {
self . moves = 0 ;
}
fn san ( & mut self , _san_plus : SanPlus ) {
self . moves += 1 ;
}
fn begin_variation ( & mut self ) -> Skip {
Skip ( true ) // stay in the mainline
}
fn end_game ( & mut self ) -> Self :: Result {
self . moves
}
}
fn main ( ) -> io :: Result < ( ) > {
let pgn = b"1. e4 e5 2. Nf3 (2. f4)
{ game paused due to bad weather }
2... Nf6 *" ;
let mut reader = BufferedReader :: new_cursor ( & pgn [ .. ] ) ;
let mut counter = MoveCounter :: new ( ) ;
let moves = reader . read_game ( & mut counter ) ? ;
assert_eq ! ( moves, Some ( 4 ) ) ;
Ok ( ( ) )
}
문서를 읽으십시오
API는 더 깨끗할 수 있으며 성능은 이전 버전 (#12)의 mmap
기반 접근법에 비해 약간 회귀되었을 수 있습니다. 이것은 약간의 관심이 필요합니다. 내가 그 일을 시작할 때까지, 나는 필요에 따라 shakmaty
에 따라 최소한의 유지 보수를하고 있습니다.
그럼에도 불구하고 아마도 여전히 가장 빠른 PGN 파서 중 하나 일 것입니다.
SSD (Samsung 850), Intel i7-6850K CPU @ 3.60GHz에서 Lichess_db_standard_2018-10.pgn (24,784,600 게임, 52,750MB의 압축되지 않은)으로 실행하십시오.
기준 | 시간 | 처리량 |
---|---|---|
예/stats.rs | 111.9s | 471.4 MB/s |
예/Validate.rs | 237.1S | 222.5 MB/s |
예제/parallel_validate.rs | 148.6S | 355.0 MB/s |
scoutfish make | 269.2S | 196.0 MB/s |
grep -F "[Event " -c | 39.2S | 1345.7 MB/s |
압축 파일이 포함 된 examples/stats.rs
:
압축 | 파일 크기 | 시간 | 처리량 |
---|---|---|---|
없음 | 52,750 MB | 111.9s | 471.4 MB/s |
BZ2 | 6,226 MB | 1263.1S | 4.9MB/s |
xz | 6,989 MB | 495.9S | 14.1 mb/s |
GZ | 10,627 MB | 335.7S | 31.7 MB/s |
LZ4 | 16,428 MB | 180.0 년대 | 91.3 MB/s |
PGN-Reader는 GPL-3.0 (또는 옵션의 이후 버전)에 따라 라이센스가 부여됩니다. 전체 라이센스 텍스트는 복사 파일을 참조하십시오.