青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

前文已經講述,字母全排列是個驚人的數字,即使只遍歷小寫字母和數字6個全排列也有36^6 = 217678233621億多個,7個排列36^7 = 78364164096783億多,8個排列36^8 = 28211099074562.8萬億多個,數字非常驚人。Md5反查是個string-string的映射,16-N個字符的映射,如果考慮hex模式的md5那就是32-N的映射,考慮映射人們最先想到的可能都是數據庫存儲方式,我也首先想到了用數據庫存儲,分別考察了一下sqliteberkeleydb,但測試下來制造數據的速度很慢,sqlite加索引大概只能到5w條記錄/s,不加索引為10w/sberkeleydb用單條模式大概只能到4.5w/s,這個速度已經很慢了,更難于接受的是如果寫1000wsqlite加索引來說不是耗時200s,而是2000s了,也就是說耗時隨單個數據文件記錄的條數增多幾乎成平方模式遞增,而不是簡單的線性遞增,這是很要命的,就算制造1億條數據耗時也是驚人,我的實測中沒有測試過用sqlite制造1000w條以上的數據,在我心目中已經否定了那種模式。雖然我知道很多號稱有多少億條數據的網站其實都是用的數據庫,我不知道他們花了多少時間制造數據,或者幾天,或者幾個月,或者更長時間,反正我對采用普通數據庫模式制造數據完全持否定態度,嵌入式速度太慢,其他數據庫則不光速度慢而且也不適合分布式應用,難道用戶每裝個點還要裝個mysql之類的數據庫,幾乎不可能啊。

下面說說我的方法,我本來第一版本是計劃先不做文件式數據庫的,第一版本來只規劃了做內存數據,充分榨取每一個字節,關于內存數據庫我實現了好幾個版本,下面分別介紹一下:

版本1hash模式

char key[16];做鍵,char pass[n];做內容,由于hash桶占用了一些字節:

                DWORD h, nKeyLen;               //hash鍵值, 字符串長度

                DWORD tag;                           //私有值,默認為0提供給外部使用

                bucket *pListNext;           //hash表雙鏈的下一個節點

                bucket *pListPrev;           //hash表雙鏈的上一個節點

                bucket *pNext;                        //拉鏈的下一個節點

                VALUE second;                        //具體數據

                _Elem first[0];                 //first

用這個hash模式大概存儲一個6個字符的串的md5信息花了50個字節,花費太多,結果自然存不了多少數據,該方案作為第一驗證方案,除了花費內存太多還是個能通過的方案。

 

版本2hash簡化方案

在上述版本基礎上簡化桶設計,拋棄作為標準桶的一些字段,精簡之后如下:

                DWORD h;                               //hash鍵值

                bucket *pNext;                        //拉鏈的下一個節點

                byte nKeyLen;                  //字符串長度

                VALUE second;                        //具體數據

                _Elem first[0];                 //first

該版本存儲一個6個字符的串的md5信息需要31個字節,比版本1少了很多,進步一些了。

方案1和方案2速度都很快。

 

版本3vector方案

考慮到hash占用內存較多,采用vector方案,直接存儲

Char mm[16];

Char pass[n];

存儲一個6個字符的串的md5信息需要22個字節,該方案排序速度太慢,查找速度肯定也比不上版本1和版本2,之后還測試過將vector里面存儲指針,那種模式每個6個字符的串的md5信息占用內存26個,接近hash版本,排序速度比直接存儲數據的好一點,但也還是很慢,總之這個方案作為一個過度方案最終也被放棄了。

 

 

方案4:全文件Hash緊縮方案

以上這些方案的特點是都存儲了char mm[16]; 也就是說存儲部分都有計算出來的md5,經過思考之后覺得可以放棄存儲md5,不存儲md5是個很妙的想法,繼續發揮hash思想,也不保存根據md5計算出來的hash值本身,只將該md5和串的信息關聯到hash值的模所在的索引節點,這樣就將索引節點信息減少到極致:

        size_t coffset;                  //content offset low

        unsigned short a:12;       //切分為12, 4

        unsigned short b:4;         //4,為下一個沖突值的索引序數,如果沒有就為0

        size_t nextindex;             //沖突條目的存儲序號,為0表示沒有沖突

 

使用該索引可讓單文件最多支持內容16T,最多687億記錄,具體實現的時候由于全使用文件所以速度比較慢,速度退化到sqlite之類同一級別了,不過這個設計思想為方案5提供了借鑒,如果跟方案5一樣用大塊內存輔助,速度大概可以上升一個級別,不過由于沒有具體實現,待研究之后再做評估。

 

方案5hash緊縮內存方案

學習方案4的設計思想,考慮僅在內存里面實現一個緊湊型文件,由于只考慮內存可表示的32位范圍,所以簡化索引節點定義如下:

Size_t coffset;          pass相對于內容區首的偏移

Size_t nindex;          沖突節點下一個序,如果為0則表示沒有沖突

內容區存儲更簡單,每個字符串直接保存,最后的0也保存,這樣每個字符串自然分開,對一個6個字符長的串來說,保存一個信息只需要15個字節,真的是省啊,1億個字符串也只要大約1.5g左右硬盤就夠了。此方案雖然很妙,但實現的時候卻費了一些周折,具體做的時候也做過好幾個版本,由于考慮該方案的內容和索引最后都可以直接保存到文件,所以該方案對位置的保存都用的是相對位置,也由于想讓索引節點信息簡單,最初是讓沖突索引采用線性步長跳躍方法,測試之后發現這個方法速度奇慢,而且還有個非常討厭的問題,隨著數據量的增多沖突擴散越來越厲害,耗時非線性的陡峭增長。放棄這個實現之后還是回到了經典的拉鏈法,拉鏈法速度就是快,但拉鏈法處理索引節點雖然容易,但要讓索引信息可直接保存卻要花一些腦子,最后采用先用內存擴展拉鏈,待全部索引構造好之后再把拉鏈出來的部分重新填到原始索引區中的空區,并修正對應索引相對位置。這個方法的精妙之處在于既省空間又有速度,最令人興奮的是采用該方法耗時隨著數據量的增大是線性增長,最后的實現在我的筆記本上大概100w/s1億條記錄從字母組合到最終生成索引文件也只要不到2分鐘的時間,制造了一些數據之后統計了一下,沖突節點比例大概占26%-35%,也就是說有65%以上的數據只要一次hash就直接命中,平均拉鏈長度1.2左右,最長拉鏈10,總體還是很滿意的。

 

原本第一版沒有考慮這個可存儲的方案,但花了幾天就搞定了一個基本可用的存儲方案還是很令人興奮的,雖然該存儲方案還有一些問題沒有徹底解決,但已經有進一步處理的辦法,待下一個相對空閑時間段再仔細研究一下,定會有更簡潔的實現做出來,至于待解決的是什么問題以及如何解決那些問題還是等我代碼寫好了再寫出來吧。

Posted on 2010-10-03 14:18 袁斌 閱讀(204) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久国产一区二区三区| 国产精品成人午夜| 一区二区三区久久网| 欧美h视频在线| 免费视频久久| 欧美a级理论片| 亚洲第一在线综合在线| 欧美91大片| 亚洲经典自拍| 一区二区欧美日韩视频| 一本色道久久综合一区| 午夜亚洲精品| 另类国产ts人妖高潮视频| 免费在线亚洲| 国产精品久久久久久影视| 国产精品综合| 在线免费观看日韩欧美| 一本到12不卡视频在线dvd| 亚洲欧美美女| 免费欧美在线| 亚洲一区二区三区涩| 久久色在线播放| 欧美日韩在线另类| 国产丝袜一区二区三区| 在线观看日产精品| 在线一区二区视频| 美女91精品| 99热精品在线观看| 久久国产精品一区二区| 欧美日韩国产免费观看| 黄网站色欧美视频| 亚洲欧美国产不卡| 亚洲大片在线观看| 亚洲欧美日韩国产精品| 欧美精品日韩一本| 在线观看福利一区| 欧美一级电影久久| 亚洲毛片在线观看| 免费成人av在线| 国内精品福利| 性欧美videos另类喷潮| 中文网丁香综合网| 国产一区二区丝袜高跟鞋图片| 亚洲黄色在线视频| 久久九九精品99国产精品| 亚洲国产色一区| 久久国产夜色精品鲁鲁99| 欧美午夜电影网| 亚洲日本欧美| 免费不卡亚洲欧美| 欧美在线观看你懂的| 国产精品第三页| 一区二区三区欧美在线| 欧美国产一区二区| 久久国产一区| 国产日产欧产精品推荐色| 亚洲深夜福利在线| 亚洲久久成人| 欧美激情一区二区三区成人| 狠狠爱综合网| 久久国产精品99国产精| 亚洲天堂久久| 欧美午夜片在线观看| 一区二区日韩欧美| 亚洲精品国产精品国自产观看浪潮 | 亚洲国产高清一区| 欧美一区二区网站| 中文欧美日韩| 欧美体内she精视频在线观看| 亚洲精品国产精品国自产观看浪潮| 久久中文字幕一区| 久久精品91久久久久久再现| 亚洲国产你懂的| 久久精品日韩欧美| 最新国产の精品合集bt伙计| 久久久精品国产免大香伊| 午夜精品久久久久久久| 国产一区二区精品| 久久性天堂网| 欧美.com| 中文久久乱码一区二区| 亚洲图片欧洲图片日韩av| 国产精品视频xxx| 久久婷婷激情| 亚洲国产你懂的| 亚洲精品1234| 欧美色欧美亚洲另类七区| 欧美一区二区视频在线| 久久精品中文字幕免费mv| 亚洲动漫精品| 亚洲精品久久视频| 欧美日韩黄色大片| 久久阴道视频| 久久综合久久综合久久综合| 国产有码在线一区二区视频| 狠狠色丁香久久婷婷综合_中| 美女黄毛**国产精品啪啪 | 在线视频精品一区| 国产视频一区欧美| 欧美大片在线观看一区| 欧美日韩亚洲一区二区| 久久在线免费观看| 欧美日韩色一区| 久久久一本精品99久久精品66| 欧美粗暴jizz性欧美20| 性欧美超级视频| 欧美国产另类| 欧美一级午夜免费电影| 美女露胸一区二区三区| 亚洲国产精品久久久久婷婷884 | 欧美大片在线观看一区二区| 狼人社综合社区| 亚洲图片在线观看| 久久亚洲国产成人| 欧美一级久久| 欧美精品一区二区三区一线天视频 | 欧美日韩一区二区在线视频| 久久黄色级2电影| 欧美日韩一区二区免费视频| 香蕉久久精品日日躁夜夜躁| 免费视频久久| 可以看av的网站久久看| 欧美日韩亚洲一区二区三区四区| 免费欧美高清视频| 国产亚洲精品综合一区91| 亚洲国产美女| 国产一区成人| 亚洲女爱视频在线| 亚洲视频在线观看免费| 免费一区视频| 麻豆精品一区二区综合av | 久久综合电影一区| 久久久久久网站| 国产综合视频| 欧美一级欧美一级在线播放| 亚洲欧美制服另类日韩| 欧美午夜www高清视频| 亚洲理论在线| 在线一区观看| 国产精品国产三级欧美二区| 亚洲美女视频在线免费观看| 亚洲精品综合| 欧美日本在线看| 日韩午夜免费| 亚洲香蕉在线观看| 国产精品你懂的在线| 亚洲在线观看视频| 久久精品国产久精国产一老狼| 国产亚洲精品成人av久久ww| 久久久91精品国产一区二区三区 | 午夜精品一区二区三区电影天堂| 一本久久知道综合久久| 欧美激情亚洲国产| 日韩午夜一区| 欧美一区二区三区啪啪| 国产日韩在线一区| 久久久精品免费视频| 欧美激情亚洲激情| 在线一区二区视频| 国产精品无人区| 欧美一区二区三区视频在线| 久久久久久久999精品视频| 国内精品视频久久| 欧美.日韩.国产.一区.二区| 日韩亚洲欧美精品| 久久精品国产99| 在线观看欧美日本| 欧美日韩不卡视频| 亚洲女人小视频在线观看| 久久婷婷丁香| 亚洲精品久久久蜜桃 | 日韩视频在线一区| 国产精品国产自产拍高清av| 久久精品国产一区二区三区免费看| 免费日韩av| 亚洲一区二区三区在线观看视频| 国产日韩欧美综合在线| 美女黄色成人网| 亚洲一区二区三区精品在线| 麻豆精品网站| 性欧美8khd高清极品| 亚洲日韩欧美视频| 国产欧美日韩综合精品二区| 欧美大片在线看免费观看| 亚洲欧美日韩天堂一区二区| 亚洲高清视频在线观看| 欧美一区二区| 中文亚洲免费| 91久久精品国产91性色tv| 国产啪精品视频| 欧美日韩精品免费观看视一区二区| 欧美在线网站| 亚洲深夜av| 亚洲黄色成人| 久久精品夜色噜噜亚洲aⅴ| 91久久一区二区| 国内精品免费在线观看| 国产精品免费福利| 欧美日韩123| 欧美国产日本|