Um leitor rápido e não alocado e de streaming para jogos de xadrez na notação PGN, como uma biblioteca de ferrugem.
Reader
analisa os jogos e chama métodos de um usuário fornecido por Visitor
. A implementação de visitantes personalizados permite a máxima flexibilidade:
Um visitante que conta o número de movimentos sintaticamente válidos na linha principal de cada jogo.
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 ( ( ) )
}
Leia a documentação
A API pode ser mais limpa e o desempenho pode ter regredido um pouco em comparação com a abordagem baseada em mmap
das versões antigas (#12). Isso precisa de alguma atenção. Até que eu me alcance, estou fazendo apenas uma manutenção mínima, seguindo shakmaty
conforme necessário.
No entanto, provavelmente ainda é um dos analisadores PGN mais rápidos do mundo.
Execute com Lichess_DB_Standard_rated_2018-10.pgn (24.784.600 jogos, 52.750 MB não compactados) em um SSD (Samsung 850), Intel i7-6850K CPU @ 3,60 GHz:
Benchmark | Tempo | Taxa de transferência |
---|---|---|
Exemplos/STATS.RS | 111.9S | 471,4 MB/S. |
exemplos/validate.rs | 237.1s | 222,5 MB/S. |
exemplos/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
com arquivos compactados:
Compressão | Tamanho do arquivo | Tempo | Taxa de transferência |
---|---|---|---|
nenhum | 52.750 MB | 111.9S | 471,4 MB/S. |
BZ2 | 6.226 MB | 1263.1s | 4,9 MB/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.0s | 91,3 MB/S. |
O PGN-Reader está licenciado no GPL-3.0 (ou em qualquer versão posterior por sua opção). Consulte o arquivo de cópia para obter o texto completo da licença.