Un lecteur rapide non allouant et en streaming pour les jeux d'échecs en notation PGN, en tant que bibliothèque de rouille.
Reader
analyse les jeux et les méthodes d'appel d'un Visitor
fourni par l'utilisateur. La mise en œuvre des visiteurs personnalisés permet une flexibilité maximale:
Un visiteur qui compte le nombre de mouvements syntaxiquement valides dans la ligne principale de chaque jeu.
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 ( ( ) )
}
Lire la documentation
L'API pourrait être plus propre et les performances peuvent avoir régressé légèrement par rapport à l'approche basée sur mmap
des anciennes versions (# 12). Cela nécessite une certaine attention. Jusqu'à ce que j'y arrive, je ne fais qu'un entretien minimal, en suivant shakmaty
au besoin.
Néanmoins, c'est probablement encore l'un des analyseurs PGN les plus rapides.
Exécutez avec lichess_db_standard_rated_2018-10.pgn (24 784 600 jeux, 52 750 Mo non compressé) sur un SSD (Samsung 850), Intel i7-6850K CPU @ 3,60 GHz:
Référence | Temps | Déborder |
---|---|---|
Exemples / stats.rs | 111.9S | 471,4 Mb / s |
exemples / valider.rs | 237.1 | 222,5 Mb / s |
Exemples / 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
avec des fichiers compressés:
Compression | Taille de fichier | Temps | Déborder |
---|---|---|---|
aucun | 52 750 Mo | 111.9S | 471,4 Mb / s |
bz2 | 6 226 Mo | 1263.1 | 4,9 Mb / s |
xz | 6 989 Mb | 495,9s | 14,1 Mb / s |
gz | 10 627 Mo | 335,7s | 31,7 Mb / s |
LZ4 | 16 428 Mo | 180.0 | 91,3 Mb / s |
PGN Reader est sous licence sous le GPL-3.0 (ou toute version ultérieure à votre option). Voir le fichier de copie du texte complet de licence.