From f793a48b820d05111d6b5e6d11c648f84094cdda Mon Sep 17 00:00:00 2001 From: KevinWang Date: Thu, 7 Mar 2024 08:23:04 +0000 Subject: [PATCH] Update README. --- ReadMe.md | 1 + maker/rust/README.md | 20 +++++++++++++++++++- maker/rust/vimdiff.png | Bin 0 -> 21382 bytes 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 maker/rust/vimdiff.png diff --git a/ReadMe.md b/ReadMe.md index 2af8562..c3adf2d 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -62,6 +62,7 @@ API 介绍,使用文档和测试程序请参考如下 `maker` 生成程序下 |     | 待开始 | [c](maker/c) | ANSC c xdb 生成程序实现 | [Lion](https://github.com/lionsoul2014) | | :white_check_mark: | 已完成 | [python](maker/python) | python xdb 生成程序实现 | [leolin49](https://github.com/leolin49) | | :white_check_mark: | 已完成 | [csharp](maker/csharp) | csharp xdb 生成程序实现 | [Alan Lee](https://github.com/malus2077) | +| :white_check_mark: | 已完成 | [rust](maker/rust) | rust xdb 生成程序实现 | [KevinWang](https://github.com/KevinWL) | # `xdb` 数据更新 diff --git a/maker/rust/README.md b/maker/rust/README.md index 0dd1aa1..43da538 100644 --- a/maker/rust/README.md +++ b/maker/rust/README.md @@ -1,7 +1,7 @@ # ip2region xdb rust 生成实现 ## 使用方法 -* 当前目录下执行 `cargo build --release` 编译生成工具 +* 当前目录下maker子目录下执行 `cargo build --release` 编译生成工具 * 目标生成在targe/release 目录下 maker * 使用方法: ``` @@ -12,3 +12,21 @@ -h, --help Print help -V, --version Print version ``` + +例如,通过默认的 data/ip.merge.txt 原数据,在target目录下生成一个 ip2region.xdb 二进制文件: + +``` +kevin@ubuntu ~/i/m/r/m/t/release (master)> ./maker -i ../../../../../data/ip.merge.txt -o ip2region.xdb +load 683844 lines +try to write the segment index ptr ... +write done, dataBlocks: 13827, IndexBlock: 683844, indexPtr: (983587, 11070069) +Done, elpsed: 0m7s + +``` + +## 数据查询/bench 测试 +* 通过将以上步骤生成的二进制文件和python 生成工具生成的二进制文件进行二进制比对,除时间戳位置不同,其它均相同。 + +![](./vimdiff.png) +* 已经完成开发的 [binding](../../binding/) 都有查询和 bench 测试程序以及使用文档,你可以使用你熟悉的语言的 searcher 进行查询测试或者bench测试,来确认数据的正确性和完整性。 + diff --git a/maker/rust/vimdiff.png b/maker/rust/vimdiff.png new file mode 100644 index 0000000000000000000000000000000000000000..39c220e95a41d089e0b7aaee7e6db581fc271210 GIT binary patch literal 21382 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

I?B@(9))8`r4lv;74 z94WE72SznoYNf&QTsFmqPztbxC=yEBdqezTK`vWovAQlKZL1*`=6u zw^3)jcpD9YQO=gT+g6355nnSC!k;5E%g8EByB`HVk@2BTq4Bvej0bOO2Odk$wr)=w zU(p`AJ`_QSEga%_=XKa1(!+6gy96fobh}4wg?uPLv8E2j&B6uyp9XqwPoYy%GVeYq ze5i1jhnh&8#S{A2$n)^6ubDbD#XQAc0_D}=Yfr*CP{4JOw?Ls*be@+NSq*3G>Bjr$ z&$<()X!Rm{u!W8KjC()|jZ?7USTT9bV3M+}MAa1Ov8*AF3Ewt%)T5WmNoP|w+h_5X z@j89|ldN5aJrHgHXN^NGiXQJ@=SO*%Ex@vS3c+2H2@kl3vhv0OeO|xTZ73fJ33HRv zFQBS&TH5IOnQPf1pf6+MVntTk7D0gjKC@T7)7c?`h$>)Sp`cwm^UI_?L095UyjUi- zg{+oDdC2AfS~p)Ze$v$q7n}2#%f>yUt8A97 z*v#fwx6LGenKuKny@_gjfF$2eUwqt=W? z)Fo1NZf7!u;b=CR;hdR7dtiJ}R1hjkBA&zX^CU=7!E%9xWE?lL^Z-T>*@pQIofV~M z7h(itVvZhj4PY z3}W53i7@nHW?|G8aY(dVtuGu_>#1KUBhqHJ3n#iZnOF6s<1 zKKW9$h?ly0O0P0McygYQ=p#s>$?}#1Y|)lqh|h@&_gv+d;eiXj(>4P{Oz6AzNh;%> zpq%-b<$ixD3IeWRodYc~c^ zmguz1ux0M(XKiF2i*+~dvfOeDOK>Z>eeiS^B8|Bj{s=XCb0iWm281l er<@DUiM(Wa?)IFsDbQVD&b!@qQFk8y