Un lector rápido no asignado y transmitido para juegos de ajedrez en notación de PGN, como una biblioteca de óxido.
Juegos y métodos de llamadas Reader
de un Visitor
proporcionado por el usuario. La implementación de visitantes personalizados permite la máxima flexibilidad:
Un visitante que cuenta el número de movimientos sintácticamente válidos en la línea principal de cada juego.
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 ( ( ) )
}
Leer la documentación
La API podría ser más limpia y el rendimiento puede haber retrocedido ligeramente en comparación con el enfoque basado en mmap
de las versiones antiguas (#12). Esto necesita algo de atención. Hasta que lo haga, solo estoy haciendo un mantenimiento mínimo, siguiendo shakmaty
según sea necesario.
No obstante, probablemente sea uno de los analizadores de PGN más rápidos.
Ejecute con lichess_db_standard_rated_2018-10.pgn (24,784,600 juegos, 52,750 MB sin comprimir) en un SSD (Samsung 850), Intel i7-6850k CPU @ 3.60 GHz:
Punto de referencia | Tiempo | Rendimiento |
---|---|---|
ejemplos/stats.rs | 111.9s | 471.4 MB/s |
ejemplos/validar.rs | 237.1s | 222.5 MB/s |
ejemplos/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
con archivos comprimidos:
Compresión | Tamaño de archivo | Tiempo | Rendimiento |
---|---|---|---|
ninguno | 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 |
PGN-Reader tiene licencia bajo el GPL-3.0 (o cualquier versión posterior en su opción). Vea el archivo de copia para el texto completo de la licencia.