Il y a quelque temps, il est devenu possible de prĂȘter attention au langage Go et la publication "Passport Control, ou Comment compresser un gigaoctet et demi Ă 42 Mo" est apparue . L'article dĂ©crit briĂšvement, mais de maniĂšre informative, une tĂąche de test pour dĂ©velopper un service de vĂ©rification des numĂ©ros de passeport russes pour leur prĂ©sence dans la liste des passeports invalides. Les principales exigences pour la mise en Ćuvre sont la rapiditĂ© de la vĂ©rification et la disponibilitĂ© du service.
AprĂšs avoir lu l'article, j'ai dĂ©cidĂ© moi-mĂȘme que c'est sur cette tĂąche pratique que vous pouvez construire votre apprentissage Go. En effet, le problĂšme de la vĂ©rification des passeports invalides, bien que ratĂ©, est intĂ©ressant, et comme les exigences de performance sont ici une prioritĂ©, l'implĂ©mentation en Go serait tout Ă fait appropriĂ©e ici.
De plus, l'article mentionné ci-dessus aborde les questions d'organisation efficace, du point de vue mémoire, des tableaux de bits (bitmaps). Et ce sujet est assez pertinent et demandé dans diverses solutions appliquées, par exemple sous la forme d'index bitmap pour un SGBD.
En consĂ©quence, le suivant: il y a une envie de regarder le langage Go, qui est nouveau pour lui-mĂȘme, il y a un problĂšme intĂ©ressant sous la forme d'organisation et d'utilisation du bitmap (naturellement dans Go), il y a une tĂąche pratique sur sur lesquels ces deux objectifs peuvent ĂȘtre Ă©laborĂ©s. Si vous ĂȘtes intĂ©ressĂ©, allez-y.
Quoi en tant que données brutes
La tĂąche mĂȘme de vĂ©rifier les passeports est construite autour de la liste principale des passeports invalides prĂ©sentĂ©e sur le site Web du ministĂšre des Affaires intĂ©rieures de la FĂ©dĂ©ration de Russie , oĂč vous pouvez Ă©galement vĂ©rifier manuellement le numĂ©ro de passeport. Vous pouvez tĂ©lĂ©charger la liste complĂšte Ă partir du site sous forme d'archive compressĂ©e de 460 Mo, une fois dĂ©compressĂ©e, nous obtenons une liste d'environ 1,5 Go, prĂ©sentĂ©e sous la forme d'un seul fichier CSV avec deux colonnes: sĂ©rie et numĂ©ro de passeport.
Ă ce jour, ce fichier CSV contient environ 132 millions de numĂ©ros de passeport. Mais le fichier contient Ă©galement des nombres erronĂ©s qui ne peuvent pas ĂȘtre identifiĂ©s sans ambiguĂŻtĂ©, par exemple, les 4 chiffres d'une sĂ©rie ou les 6 chiffres d'un nombre ne sont pas indiquĂ©s, il peut y avoir des sĂ©ries alphabĂ©tiques.
4- 6- , , , . , , , .. , .
Go , , .
â
. , . , â . , 10 000 ( 0 9999), 1 000 000 ( 0 999998, .. 000001). , ( , G), .. 10 000 bitmap, bitmap 15 625 uint64.
15 625?
, 1 000 000 125 000 , , , 15 625 ( x86-64)
, , 1.25 , 10 000 bitmap. , .. . â , 10 000 bitmap 3 300 ( ).
â
â , , bitmap , . , , , ..15 625 1 000 000 . , . , .
bitmap â roaring bitmap.
â
, , . Pilosa.
Pilosa â . Pilosa , , . â () .
, , , .. Pilosa. , Pilosa, .. (binary matrices).
Pilosa , Go, «» Go, . « ». Pilosa.
, :
. - , â Pilosa.
http . GET , POST, json. .
.
, , ..
, , , Docker .
, . .
. , Go « » , , , , . , , , Go . Go , , , Linux, Mac OS Windows, . , , uint16 uint64.
Go, , , .
, , GitHub. Go, Go «». roaring bitmap Pilosa , .
, , . , , , , . , - API . â , , . . , .. , . , .
API
, , GET
http://localhost:8080/passport?series=8003&number=011384
html json , , ContentType "application/json" .
"application/json":
[{
"series": "8003",
"number": "011384",
"status": "non-valid"
}]
status âvalidâ ânon-validâ
json POST , status:
http://localhost:8080/passport
[
{
"series": "4050",
"number": "039589"
},
{
"series": "5203",
"number": "257719"
},
{
"series": "5000",
"number": "347024"
},
{
"series": "2507",
"number": "857721"
},
{
"series": "2507" ,
"number": "857728"
}
]
, status. - , , ( 100)
i7 7- 16 Gb , Windows Pro WSL2(Windows Subsystem for Linux), Docker Desktop For Windows. , , : Windows, WSL url ApacheBench 1000- , 100 . , Go (benchmark), , .
:
( );
;
.
bitmap
1.5 30 , . , , .
, «» , 1.25 Gb ( ), 440 . - , .. . , .
(1000 100 ), , «Time per request» 0.1 ms , , .
, :
30 ;
440 ;
0.10 ms.
, .
roaring bitmap
1.5 , bitmap. 44 (!) , , , . 0.18ms, , , , .
roaring bitmap:
, bitmap :
90 ;
44 ;
0.18 ms.
. , , .. roaring bitmap, 64- C (Croaring).
Pilosa
Pilosa , . , . , Pilosa Windows, , , . , « ». , Pilosa docker- Windows â .
Pilosa , , .. .
Pilosa â 1 1000 . 132 .
Pilosa WSL2, .
Pilosa 4 , , , , , , , , .. .
Pilosa , , , , .. Pilosa bitmap roaring bitmap.
â 0.5 ms .
Pilosa:
240 ;
;
0.5 ms.
, Pilosa , , , . , (timestamp), Pilosa.
, Go . . , . â Go .
, - , , Go.
roaring bitmap . bitmap bitmap, roaring bitmap.