Hace algún tiempo, se hizo posible prestar atención al lenguaje Go y surgió la publicación "Control de pasaportes, o Cómo comprimir un gigabyte y medio a 42 Mb" . El artículo describe brevemente, pero de manera informativa, una tarea de prueba para desarrollar un servicio para verificar los números de pasaportes rusos para verificar su presencia en la lista de pasaportes inválidos. Los principales requisitos para la implementación son la velocidad de verificación y la disponibilidad del servicio.
Después de leer el artículo, decidí por mí mismo que es en esta tarea práctica que puedes construir tu aprendizaje de Go. De hecho, el problema de verificar pasaportes inválidos, aunque trillado, es interesante, y dado que los requisitos de desempeño son una prioridad aquí, la implementación en Go sería bastante apropiada aquí.
Además, el artículo mencionado anteriormente aborda las cuestiones de la organización eficiente, desde el punto de vista de la memoria, de matrices de bits (mapas de bits). Y este tema es bastante relevante y solicitado en varias soluciones aplicadas, por ejemplo, en forma de índices de mapa de bits para un DBMS.
Como resultado, lo siguiente: hay un deseo de mirar el lenguaje Go, que es nuevo en sí mismo, hay un problema interesante en la forma de organización y uso del mapa de bits (naturalmente en Go), hay una tarea práctica en que estos dos objetivos se pueden resolver. Si está interesado, adelante.
Que como datos brutos
La misma tarea de verificar los pasaportes se basa en la lista principal de pasaportes inválidos presentada en el sitio web del Ministerio del Interior de la Federación de Rusia , donde también puede verificar manualmente el número de pasaporte. Puede descargar la lista completa del sitio como un archivo empaquetado de 460 MB de tamaño, mientras que sin empaquetar, obtenemos una lista de aproximadamente 1.5 GB de tamaño, presentada como un solo archivo CSV con dos columnas: serie y número de pasaporte.
Hasta la fecha, este archivo CSV contiene alrededor de 132 millones de números de pasaporte. Pero el archivo también contiene números erróneos que no se pueden identificar sin ambigüedades, por ejemplo, los 4 dígitos de una serie o los 6 dígitos de un número no están indicados, puede haber series alfabéticas.
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.