Beberapa waktu yang lalu, menjadi mungkin untuk memperhatikan bahasa Go dan publikasi "Kontrol Paspor, atau Cara Mengompres Satu Setengah Gigabyte hingga 42 Mb" muncul . Artikel tersebut secara singkat, tetapi informatif, menjelaskan tugas tes untuk mengembangkan layanan untuk memeriksa nomor paspor Rusia untuk keberadaan mereka dalam daftar paspor yang tidak valid. Persyaratan utama untuk implementasi adalah kecepatan verifikasi dan ketersediaan layanan.
Setelah membaca artikel tersebut, saya memutuskan sendiri bahwa pada tugas praktis inilah Anda dapat membangun pembelajaran Go Anda. Memang, masalah memeriksa paspor yang tidak valid, meskipun usang, menarik, dan karena persyaratan kinerja menjadi prioritas di sini, penerapan di Go akan cukup sesuai di sini.
Selain itu, artikel yang disebutkan di atas menyentuh masalah efisiensi, dari sudut pandang memori, organisasi array bit (bitmap). Dan topik ini cukup relevan dan diminati dalam berbagai solusi terapan, misalnya dalam bentuk indeks bitmap untuk suatu DBMS.
Akibatnya, sebagai berikut: ada keinginan untuk melihat bahasa Go, yang baru untuk dirinya sendiri, ada masalah yang menarik berupa pengorganisasian dan penggunaan bitmap (secara alami di Go), ada tugas praktis di dimana kedua tujuan ini dapat diselesaikan. Jika tertarik, silakan.
Apa sebagai data mentah
Tugas pemeriksaan paspor dibangun di sekitar daftar utama paspor tidak valid yang disajikan di situs web Kementerian Dalam Negeri Federasi Rusia , di mana Anda juga dapat memeriksa nomor paspor secara manual. Anda dapat mengunduh seluruh daftar dari situs sebagai arsip yang dikemas berukuran 460 MB, sementara membongkar, kami mendapatkan daftar berukuran sekitar 1,5 GB, disajikan sebagai file CSV tunggal dengan dua kolom: seri dan nomor paspor.
Hingga saat ini, file CSV ini berisi sekitar 132 juta nomor paspor. Tetapi file juga berisi nomor yang salah yang tidak dapat diidentifikasi dengan jelas, misalnya, semua 4 digit untuk sebuah seri atau semua 6 digit untuk sebuah nomor tidak diindikasikan, mungkin ada deret alfabet.
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.