錆ライブラリとして、PGN表記のチェスゲーム用の速い非割り当ておよびストリーミングリーダー。
Reader
ゲームを解析し、ユーザーが提供するVisitor
のメソッドを呼び出します。カスタム訪問者を実装することで、柔軟性を最大限に活用できます。
各ゲームのメインラインで構文的に有効な動きの数を数える訪問者。
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 ( ( ) )
}
ドキュメントを読んでください
APIはよりクリーンである可能性があり、パフォーマンスは古いバージョンからのmmap
ベースのアプローチと比較してわずかに退行した可能性があります(#12)。これにはある程度の注意が必要です。私がそれに近づくまで、私は必要に応じてshakmaty
に従って、最小限のメンテナンスのみを行っています。
それにもかかわらず、それはおそらくまだ周りの最速のPGNパーサーの1つです。
lichess_db_standard_rated_2018-10.pgn(24,784,600ゲーム、52,750 MBの非圧縮)でSSD(Samsung 850)、Intel I7-6850K CPU @ 3.60 GHz:
ベンチマーク | 時間 | スループット |
---|---|---|
例/stats.rs | 111.9秒 | 471.4 MB/s |
例/validate.rs | 237.1S | 222.5 MB/s |
例/parallel_validate.rs | 148.6s | 355.0 MB/s |
scoutfish make | 269.2秒 | 196.0 MB/s |
grep -F "[Event " -c | 39.2秒 | 1345.7 MB/s |
圧縮ファイルを使用したexamples/stats.rs
:
圧縮 | ファイルサイズ | 時間 | スループット |
---|---|---|---|
なし | 52,750 MB | 111.9秒 | 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.0秒 | 91.3 MB/s |
PGN-Readerは、GPL-3.0(またはオプションの後のバージョン)の下でライセンスされています。完全なライセンステキストについては、コピーファイルを参照してください。