Ein schneller Nicht-Adlocating- und Streaming-Leser für Schachspiele in PGN Notation, als Rostbibliothek.
Reader
analysiert Spiele und ruft Methoden eines vom Benutzer zur Verfügung gestellten Visitor
an. Durch die Implementierung benutzerdefinierter Besucher maximale Flexibilität:
Ein Besucher, der die Anzahl der syntaktisch gültigen Bewegungen in der Hauptlinie jedes Spiels zählt.
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 ( ( ) )
}
Lesen Sie die Dokumentation
Die API könnte sauberer sein und die Leistung kann im Vergleich zum mmap
-basierten Ansatz aus alten Versionen (Nr. 12) leicht zurückgezogen sein. Dies braucht etwas Aufmerksamkeit. Bis ich mich dazu ankomme, mache ich nur minimale Wartung, nachdem ich nach Bedarf shakmaty
befolgt.
Trotzdem ist es wahrscheinlich immer noch einer der schnellsten PGN -Parsers.
Führen Sie mit lichess_db_standard_rated_2018-10.pgn (24.784.600 Spiele, 52.750 MB unkomprimiert) auf einem SSD (Samsung 850), Intel i7-6850K CPU @ 3,60 GHz:
Benchmark | Zeit | Durchsatz |
---|---|---|
Beispiele/Stats.Rs | 111.9s | 471,4 MB/s |
Beispiele/validate.rs | 237.1s | 222,5 MB/s |
Beispiele/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
mit komprimierten Dateien:
Kompression | Dateigröße | Zeit | Durchsatz |
---|---|---|---|
keiner | 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 ist unter der GPL-3.0 (oder einer späteren Version nach Ihrer Option) lizenziert. In der Kopierdatei finden Sie den vollständigen Lizenztext.