Pembaca yang tidak beralasan dan streaming cepat untuk game catur dalam notasi PGN, sebagai perpustakaan karat.
Reader
parses game dan metode panggilan dari Visitor
yang disediakan pengguna. Menerapkan pengunjung khusus memungkinkan untuk fleksibilitas maksimum:
Pengunjung yang menghitung jumlah gerakan yang valid secara sintaksis di arus utama setiap game.
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 ( ( ) )
}
Baca dokumentasinya
API bisa lebih bersih dan kinerja mungkin telah mengalami kemunduran sedikit dibandingkan dengan pendekatan berbasis mmap
dari versi lama (#12). Ini membutuhkan perhatian. Sampai saya mengatasinya, saya hanya melakukan perawatan minimal, mengikuti shakmaty
sesuai kebutuhan.
Meskipun demikian, itu mungkin masih salah satu parser PGN tercepat.
Jalankan dengan lichess_db_standard_rated_2018-10.pgn (24.784.600 game, 52.750 MB tidak terkompresi) pada SSD (Samsung 850), Intel I7-6850K CPU @ 3.60 GHz:
Benchmark | Waktu | Throughput |
---|---|---|
contoh/stats.rs | 111.9s | 471.4 MB/s |
Contoh/Validasi.RS | 237.1s | 222.5 MB/s |
Contoh/paralel_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
dengan file terkompresi:
Kompresi | Ukuran file | Waktu | Throughput |
---|---|---|---|
tidak ada | 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 dilisensikan di bawah GPL-3.0 (atau versi selanjutnya di opsi Anda). Lihat file salinan untuk teks lisensi lengkap.