Быстрый не выделяющий и потоковой считыватель для шахматных игр в нотации 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.
Запустите с Lichess_db_standard_rated_2018-10.PGN (24 784 600 игр, 52 750 МБ несжатость) на SSD (Samsung 850), Intel I7-6850K CPU @ 3,60 ГГц:
Эталон | Время | Пропускная способность |
---|---|---|
Примеры/статистики | 111.9 с | 471,4 МБ/с |
Примеры/validate.rs | 237.1S | 222,5 МБ/с |
Примеры/parallel_validate.rs | 148.6s | 355,0 МБ/с |
scoutfish make | 269,2 с | 196,0 МБ/с |
grep -F "[Event " -c | 39,2 с | 1345,7 МБ/с |
examples/stats.rs
с сжатыми файлами:
Сжатие | Размер файла | Время | Пропускная способность |
---|---|---|---|
никто | 52 750 МБ | 111.9 с | 471,4 МБ/с |
BZ2 | 6226 МБ | 1263.1S | 4,9 МБ/с |
XZ | 6 989 МБ | 495,9 с | 14,1 МБ/с |
гз | 10 627 МБ | 335,7 с | 31,7 МБ/с |
LZ4 | 16 428 МБ | 180.0S | 91,3 МБ/с |
PGN-reader лицензирован в GPL-3.0 (или любой более поздней версии на вашем варианте). Смотрите файл копирования для полной лицензии.