最新IP數據庫 存儲優化 查詢性能優化 每秒解析上千萬

高性能IP數據庫格式詳解

每秒解析1000多萬ip??qqzeng-ip-ultimate.dat 3.0版

編碼:UTF8? ? ?字節序:Little-Endian

返回規范字段(如:亞洲|中國|香港|九龍|油尖旺|新世界電訊|810200|Hong Kong|HK|114.17495|22.327115)

------------------------ 文件結構? -------------------------
//?文件頭 4字節
[IP段數量]

//?前綴區 8字節(4-4) 256*8
[索引區start第幾個][索引區end第幾個]


//?索引區 8字節(4-3-1) ip段行數x8
[結束IP數字][地區流位置][流長度]

//?內容區 長度無限制
[地區信息][地區信息]……唯一不重復

------------------------ 文件結構 ---------------------------

優勢:壓縮形式將數據存儲在內存中,通過減少將相同數據讀取到內存的次數來減少I/O.
? ? ? ? ? 較高的壓縮率通過使用更小的內存中空間提高查詢性能。
? ? ? ? ? 前綴區為作為縮小查詢范圍,索引區和內容區長度一樣,
? ? ? ? ? 解析出來一次性加載到數組中,查詢性能提高3-5倍!

壓縮:原版txt為38.5M,生成dat結構為3.68M 。
? ? ? ? ? 和上一版本2.0不同的是索引區去掉了[開始IP數字]4字節,節省多1-2M。
? ? ? ? ? 3.0版本只適用[全球版],條件為ip段區間連續且覆蓋所有IPV4。
? ? ? ? ? 2.0版本適用[全球版][國內版][國外版]

性能:每秒解析1000多萬ip?

創建:qqzeng-ip 于 2018-04-08

?

性能測試? ?( CPU i7-7700K + DDR2400 16G + win10 X64 )

查詢【3.0】內存優化版 3414萬ip->3.318秒 每秒1028.93309222423萬次
查詢【3.0】內存優化版 4439萬ip->4.199秒 每秒1057.1564658252萬次
查詢【3.0】內存優化版 4056萬ip->3.821秒 每秒1061.50222454855萬次
查詢【3.0】內存優化版 1781萬ip->1.68秒 每秒1060.11904761905萬次
查詢【3.0】內存優化版 3862萬ip->3.66秒 每秒1055.1912568306萬次
查詢【3.0】內存優化版 3479萬ip->3.31秒 每秒1051.05740181269萬次
查詢【3.0】內存優化版 2892萬ip->2.713秒 每秒1065.97862145227萬次
查詢【3.0】內存優化版 3484萬ip->3.263秒 每秒1067.72908366534萬次
查詢【3.0】內存優化版 2699萬ip->2.548秒 每秒1059.26216640502萬次
查詢【3.0】內存優化版 88萬ip->0.087秒 每秒1011.49425287356萬次
查詢【3.0】內存優化版 161萬ip->0.153秒 每秒1052.28758169935萬次
查詢【3.0】內存優化版 91萬ip->0.088秒 每秒1034.09090909091萬次
查詢【3.0】內存優化版 42萬ip->0.041秒 每秒1024.39024390244萬次
查詢【3.0】內存優化版 159萬ip->0.152秒 每秒1046.05263157895萬次
查詢【3.0】內存優化版 88萬ip->0.084秒 每秒1047.61904761905萬次
查詢【3.0】內存優化版 123萬ip->0.118秒 每秒1042.37288135593萬次
查詢【3.0】內存優化版 106萬ip->0.101秒 每秒1049.50495049505萬次
查詢【3.0】內存優化版 61萬ip->0.059秒 每秒1033.89830508475萬次
查詢【3.0】內存優化版 177萬ip->0.169秒 每秒1047.33727810651萬次
查詢【3.0】內存優化版 106萬ip->0.101秒 每秒1049.50495049505萬次

查詢【3.0】普通優化版 1464萬ip->3.408秒 每秒429.577464788732萬次
查詢【3.0】普通優化版 352萬ip->0.803秒 每秒438.356164383562萬次
查詢【3.0】普通優化版 1357萬ip->3.042秒 每秒446.088099934254萬次
查詢【3.0】普通優化版 184萬ip->0.43秒 每秒427.906976744186萬次
查詢【3.0】普通優化版 752萬ip->1.697秒 每秒443.134944018857萬次
查詢【3.0】普通優化版 1795萬ip->4.032秒 每秒445.188492063492萬次
查詢【3.0】普通優化版 1823萬ip->4.076秒 每秒447.252208047105萬次
查詢【3.0】普通優化版 723萬ip->1.622秒 每秒445.745992601726萬次
查詢【3.0】普通優化版 136萬ip->0.319秒 每秒426.332288401254萬次
查詢【3.0】普通優化版 334萬ip->0.756秒 每秒441.798941798942萬次
查詢【3.0】普通優化版 636萬ip->1.435秒 每秒443.205574912892萬次
查詢【3.0】普通優化版 701萬ip->1.578秒 每秒444.233206590621萬次
查詢【3.0】普通優化版 1807萬ip->4.07秒 每秒443.980343980344萬次
查詢【3.0】普通優化版 489萬ip->1.105秒 每秒442.533936651584萬次

?

?

隨機生成 IP

 RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();byte[] bytes = new byte[4];rngCsp.GetBytes(bytes);uint value = ReadBigEndian32(bytes[0], bytes[1], bytes[2], bytes[3]);

?

?

開發參考 (解析dat以及查詢)

    public class IPSearch3Fast{private static readonly Lazy<IPSearch3Fast> lazy = new Lazy<IPSearch3Fast>(() => new IPSearch3Fast());public static IPSearch3Fast Instance { get { return lazy.Value; } }private IPSearch3Fast(){LoadDat();Watch();}private string datPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"qqzeng-ip-ultimate.dat");private DateTime lastRead = DateTime.MinValue;private long[,] prefmap = new long[256, 2];private uint[] endArr;private string[] addrArr;private byte[] data;/// <summary>/// 初始化二進制 qqzeng-ip-ultimate.dat 數據/// </summary>private void LoadDat(){data = File.ReadAllBytes(datPath);for (int k = 0; k < 256; k++){int i = k * 8 + 4;int prefix = k;long startIndex = ReadLittleEndian32(data[i], data[i + 1], data[i + 2], data[i + 3]);long endIndex = ReadLittleEndian32(data[i + 4], data[i + 5], data[i + 6], data[i + 7]);prefmap[k, 0] = startIndex; prefmap[k, 1] = endIndex;}uint RecordSize = ReadLittleEndian32(data[0], data[1], data[2], data[3]);endArr = new uint[RecordSize];addrArr = new string[RecordSize];for (int i = 0; i < RecordSize; i++){long p = 2052 + (i * 8);uint endipnum = ReadLittleEndian32(data[p], data[1 + p], data[2 + p], data[3 + p]);int offset = data[4 + p] + ((data[5 + p]) << 8) + ((data[6 + p]) << 16);int length = data[7 + p];endArr[i] = endipnum;addrArr[i] = Encoding.UTF8.GetString(data, offset, length);}}private void Watch(){FileInfo fi = new FileInfo(datPath);FileSystemWatcher watcher = new FileSystemWatcher(fi.DirectoryName){IncludeSubdirectories = false,NotifyFilter = NotifyFilters.LastWrite,Filter = "qqzeng-ip-ultimate.dat",};watcher.Changed += (s, e) =>{var lastWriteTime = File.GetLastWriteTime(datPath);if (lastWriteTime > lastRead){                   //延時 解決 正由另一進程使用,因此該進程無法訪問此文件Thread.Sleep(1000);LoadDat();lastRead = lastWriteTime;}};watcher.EnableRaisingEvents = true;}/// <summary>/// ip快速查詢方法/// </summary>/// <param name="ip">1.1.1.1</param>/// <returns></returns>public string Find(string ip){long val = IpToInt(ip, out long pref);long low = prefmap[pref, 0], high = prefmap[pref, 1];long cur = low == high ? low : BinarySearch(low, high, val);return addrArr[cur];}// 二分逼近 O(logN)private long BinarySearch(long low, long high, long k){long M = 0, mid = 0;while (low <= high){mid = (low + high) / 2;uint endipnum = endArr[mid];if (endipnum >= k){M = mid;if (mid == 0){break;   //防止溢出
                    }high = mid - 1;}elselow = mid + 1;}return M;}private long IpToInt(string ipString, out long prefix){//高性能int end = ipString.Length;unsafe{fixed (char* name = ipString){int numberBase = 10;char ch;long[] parts = new long[4];long currentValue = 0;int dotCount = 0;int current = 0;for (; current < end; current++){ch = name[current];currentValue = 0;numberBase = 10;if (ch == '0'){numberBase = 8;current++;if (current < end){ch = name[current];if (ch == 'x' || ch == 'X'){numberBase = 16;current++;}}}for (; current < end; current++){ch = name[current];int digitValue;if ((numberBase == 10 || numberBase == 16) && '0' <= ch && ch <= '9'){digitValue = ch - '0';}else if (numberBase == 8 && '0' <= ch && ch <= '7'){digitValue = ch - '0';}else if (numberBase == 16 && 'a' <= ch && ch <= 'f'){digitValue = ch + 10 - 'a';}else if (numberBase == 16 && 'A' <= ch && ch <= 'F'){digitValue = ch + 10 - 'A';}else{break;}currentValue = (currentValue * numberBase) + digitValue;}if (current < end && name[current] == '.'){parts[dotCount] = currentValue;dotCount++;continue;}break;}parts[dotCount] = currentValue;prefix = parts[0];return (parts[0] << 24) | ((parts[1] & 0xff) << 16) | ((parts[2] & 0xff) << 8) | (parts[3] & 0xff);}}//簡潔的 普通 //byte[] b = IPAddress.Parse(ip).GetAddressBytes();//prefix = b[0];  // return ReadBigEndian32(b[0], b[1], b[2], b[3]);
        }private uint ReadBigEndian32(byte a, byte b, byte c, byte d){return (uint)((a << 24) | (b << 16) | (c << 8) | d);}private uint ReadLittleEndian32(byte a, byte b, byte c, byte d){return (uint)(a | (b << 8) | (c << 16) | (d << 24));}}/*(調用例子):   string result = IPSearch3Fast.Instance.Find("1.2.3.4");--> result="亞洲|中國|香港|九龍|油尖旺|新世界電訊|810200|Hong Kong|HK|114.17495|22.327115"*/

?

開發代碼:https://github.com/zengzhan/qqzeng-ip

?

轉載于:https://www.cnblogs.com/zengxiangzhan/p/8816243.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254909.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254909.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254909.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HALCON示例程序stamp_catalogue.hdev分割圖片與文字

小哥哥小姐姐覺得有用點個贊唄&#xff01; HALCON示例程序stamp_catalogue.hdev分割圖片與文字 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 gen_rectangle1 (Rect, 0, 0, 5, 5) dev_update_var (‘off’) dev_update_window (‘off’) dev_close_win…

[BZOJ]1023: [SHOI2008]cactus仙人掌圖

Time Limit: 1 Sec Memory Limit: 162 MB Description 如果某個無向連通圖的任意一條邊至多只出現在一條簡單回路&#xff08;simple cycle&#xff09;里&#xff0c;我們就稱這張圖為仙人掌圖&#xff08;cactus&#xff09;。所謂簡單回路就是指在圖上不重復經過任何一個頂…

實現RTP協議的H.264視頻傳輸系統

1. 引言 隨著信息產業的發展&#xff0c;人們對信息資源的要求已經逐漸由文字和圖片過渡到音頻和視頻&#xff0c;并越來越強調獲取資源的實時性和互動性。但人們又面臨著另外一種不可避免的尷尬&#xff0c;就是在網絡上看到生動清晰的媒體演示的同時&#xff0c;不得…

機器人網首頁應用實例工業自動化 EtherCAT 技術在庫卡機器人控制系統上的應用

自 2010 年以來&#xff0c;庫卡一直采用 EtherCAT 技術作為所有庫卡機器人控制系統中的系統總線。最新的 KR AGILUS 機器人和 LBR iiwa 輕型機器人的緊湊型控制器也是在 EtherCAT 基礎上實施的。Beckhoff 基于工業以太網的 EtherCAT因而可以作為整個當前庫卡控制系統范圍內的…

KVM虛擬機共享存儲動態遷移與冷遷移

運行環境一、 配置nfs共享服務器二、 配置KVM虛擬化三、 創建橋接網卡四、 配置kvm服務器并實現動態遷移五、 配置冷遷移運行環境KVM虛擬機兩臺&#xff08;linux 7.4&#xff09;IP地址&#xff1a;192.168.80.100&#xff08;KVM01&#xff09;IP地址&#xff1a;192.168.80.…

HALCON示例程序surface_scratch.hdev提取劃痕

小哥哥小姐姐覺得有用點個贊唄&#xff01; HALCON示例程序surface_scratch.hdev提取劃痕 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off () dev_close_window () read_image (Image, ‘surface_scratch’) get_image_size (Image, Width…

MySQL--SQL中的安全問題

---恢復內容開始--- 1) SQL 注入簡介 SQL 注入(SQL Injection) 就是利用某些數據庫的外部接口將用戶數據插入到實際的數據庫操作語言(SQL)當中&#xff0c;從而達到入侵數據庫乃至操作系統的目的。他的產生主要是由程序對用戶輸入的數據沒有進行嚴格的過濾&#xff0c;導致非法…

伺服驅動器的 三環控制 電流環 速度環 位置環

運動伺服一般都是三環控制系統&#xff0c;從內到外依次是電流環速度環位置環。 1、電流環&#xff1a;電流環的輸入是速度環PID調節后的那個輸出&#xff0c;我們稱為“電流環給定”吧&#xff0c;然后呢就是電流環的這個給定和“電流環的反饋”值進行比較后的差值在電流環內做…

理解LSTM/RNN中的Attention機制

轉自&#xff1a;http://www.jeyzhang.com/understand-attention-in-rnn.html&#xff0c;感謝分享&#xff01; 導讀 目前采用編碼器-解碼器 (Encode-Decode) 結構的模型非常熱門&#xff0c;是因為它在許多領域較其他的傳統模型方法都取得了更好的結果。這種結構的模型通常將…

linux下基于jrtplib庫的實時傳送實現

linux 下基于jrtplib庫的實時傳送實現一、RTP 是進行實時流媒體傳輸的標準協議和關鍵技術實時傳輸協議&#xff08;Real-time Transport Protocol&#xff0c;PRT&#xff09;是在 Internet 上處理多媒體數據流的一種網絡協議&#xff0c;利用它能夠在一對一&#xff08;unicas…

[BZOJ2326] [HNOI2011] 數學作業 (矩陣乘法)

Description Input Output Sample Input Sample Output HINT Source Solution 遞推式長這樣&#xff1a;$f[n]f[n-1]*10^kn$ 對于每一段位數個數相同的$n$&#xff08;如$10\sim99,100\sim999,23333\sim66666,1018701389\sim2147483647$&#xff09;&#xff0c;$k$是個定值 然…

HALCON示例程序texture.hdev檢測樹木

小哥哥小姐姐覺得有用點個贊唄&#xff01; HALCON示例程序texture.hdev檢測樹木 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_close_window () Interactive : 0 dev_close_window () read_image (MreutHill, ‘mreut_y’) get_image_size (MreutH…

1、python基礎速成

基礎模塊 def prt(age,name):#函數定義 print("%s is %d 年齡 old"%(name,age)) if __name__"__main__":#程序入口 print("Hello World") prt(45,"gaici") 獲取輸入&#xff1a;使用input()函數 nameinput("you name &#x…

老男孩博客園楊海潮MySQL--MySQL機構邏輯2

轉載于:https://blog.51cto.com/yanfeilai528/2103403

法國標致雪鐵龍汽車公司采用通快碟片激光器進行焊接

發布日期&#xff1a;2011-10-14 來源&#xff1a;光電新聞網 發布人&#xff1a;星之球科技 摘要&#xff1a;3月11日消息&#xff0c;十一個碟片激光器&#xff08;disk laser&#xff09;將安裝在標致雪鐵龍集團的工廠&#xff0c;這家法國汽車制造商準備使用4千瓦的激光器…

h.264 rtp打包

(2011-05-27 08:44:13) 轉載標簽&#xff1a; 雜談 payload,H.264 RTP payload 格式 on 2011-2-18 in 博文摘選 | 0 Comment 1. 網絡抽象層單元類型 (NALU) NALU 頭由一個字節組成, 它的語法如下: --------------- |0|1|2|3|4|5|6|7| -------- |F|NRI| Type | --------------…

jquery live hover綁定方法

$(".select_item span").live({mouseenter:function(){$(this).addClass("hover");},mouseleave:function(){$(this).removeClass("hover");} }); 注意&#xff1a;jquery1.9以上版本不支持live&#xff0c;新方法為on 轉載于:https://www.cnblo…

HALCON示例程序vessel.hdev血管的分割與測量

小哥哥小姐姐覺得有用點個贊唄&#xff01; HALCON示例程序vessel.hdev血管的分割與測量 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_window (‘off’) dev_close_window () dev_open_window (0, 0, 512, 512, ‘black’, WindowID) set_d…

電子凸輪

CAM功能是按照一種人為預先設定的曲線關系(可以在線修改,對SEW的變頻/伺服控制器而言)來運動的控制應用。 100%速度前饋的位置控制這個觀點偶不敢茍同.典型的一些應用。比如:全自動包裝機械上,移動鋸,其實大家說的電子齒輪&#xff0c;指的就是一種可以調節主從速度比的同步應用…

浙南聯合訓練賽20180414

這次題目的代碼都不長&#xff0c;CF的一貫風格 A - Game CodeForces - 513A Two players play a simple game. Each player is provided with a box with balls. First players box contains exactly n1 balls and second players box contains exactly n2balls. In one move…