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

前文已經講述,字母全排列是個驚人的數字,即使只遍歷小寫字母和數字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>
            久久经典综合| 在线观看亚洲精品视频| 亚洲欧美电影在线观看| 国产精品99久久久久久久女警| 91久久国产综合久久蜜月精品| 欧美成人tv| 亚洲精品日韩一| 亚洲一区二区三区免费视频| 欧美专区一区二区三区| 欧美va天堂va视频va在线| 欧美精品在线视频观看| 国产精品视频999| 含羞草久久爱69一区| 亚洲精品国产精品国自产观看| 中日韩美女免费视频网站在线观看| 亚洲欧美国产另类| 久久天堂成人| 99国产精品私拍| 香蕉久久国产| 欧美福利小视频| 国产麻豆综合| av成人毛片| 免费在线成人| 亚洲欧美日韩中文视频| 另类图片综合电影| 国产精品嫩草影院一区二区| 亚洲国产欧美久久| 欧美一级艳片视频免费观看| 欧美国产第二页| 91久久精品美女高潮| 欧美日韩三级在线| 国内视频精品| 亚洲一区图片| 亚洲高清一区二| 欧美诱惑福利视频| 欧美天天在线| 亚洲免费观看高清完整版在线观看| 欧美专区福利在线| 一本色道久久88综合日韩精品| 久久尤物电影视频在线观看| 国产精品亚洲综合| 亚洲一区二区精品视频| 亚洲电影免费观看高清完整版在线 | 欧美视频久久| 91久久精品国产| 久久精品1区| 亚洲欧美国产三级| 国产精品成人v| 亚洲午夜日本在线观看| 亚洲精品一区二区三区不| 欧美a级片网| 亚洲国产美女| 免费高清在线一区| 久久成人综合视频| 狠狠干成人综合网| 久久亚洲二区| 久久人人97超碰精品888| 国产亚洲欧美色| 久久激情综合网| 久久九九热re6这里有精品 | 精品福利av| 久久久另类综合| 欧美在线视频导航| 黄色成人免费观看| 老司机67194精品线观看| 欧美一区网站| 狠狠色狠狠色综合日日tαg| 久久偷窥视频| 久久综合影视| 99热这里只有精品8| 日韩亚洲欧美成人| 国产精品毛片高清在线完整版 | 最新成人av网站| 欧美日韩成人免费| 午夜精品久久久99热福利| 亚洲欧美日韩系列| 伊人色综合久久天天| 亚洲国产精品一区制服丝袜| 欧美日韩午夜激情| 久久av一区二区三区漫画| 久久久精品动漫| 一个人看的www久久| 亚洲欧美日韩中文播放| 欧美精品自拍偷拍动漫精品| 欧美精品在线免费| 亚洲综合日本| 久久精品72免费观看| 亚洲韩国日本中文字幕| 999在线观看精品免费不卡网站| 国产欧美精品国产国产专区| 蜜臀va亚洲va欧美va天堂 | 国产一区二区三区高清播放| 欧美电影在线播放| 欧美午夜电影网| 久久五月婷婷丁香社区| 欧美日产在线观看| 久久精品视频免费| 欧美风情在线| 欧美一区二区三区四区在线观看地址| 久久激情中文| 亚洲无毛电影| 玖玖精品视频| 欧美一区二视频在线免费观看| 久热精品在线视频| 欧美一级网站| 欧美色精品在线视频| 欧美丰满高潮xxxx喷水动漫| 国产精品欧美日韩一区二区| 亚洲激情视频网| 黑人操亚洲美女惩罚| 99国产精品视频免费观看一公开| 激情五月***国产精品| 亚洲一区精品视频| 一本久道久久久| 免费观看亚洲视频大全| 久久深夜福利| 国产欧美精品在线播放| 99精品视频免费观看视频| 亚洲精品国产精品国自产观看浪潮| 久久国内精品视频| 欧美一区亚洲| 国产精品呻吟| 亚洲一本视频| 亚洲欧美不卡| 国产精品久久久久一区二区三区共 | 免费亚洲电影在线| 国产在线一区二区三区四区| 一区二区三区欧美激情| 一本久道久久久| 欧美日韩国产高清| 亚洲精品国产精品国产自| 亚洲第一色在线| 久久一区中文字幕| 蜜臀99久久精品久久久久久软件| 国产欧美日韩三级| 午夜激情综合网| 久久精品一级爱片| 国内成人在线| 久久精品一区二区三区不卡牛牛| 久久精视频免费在线久久完整在线看| 国产老肥熟一区二区三区| 亚洲一卡二卡三卡四卡五卡| 午夜精品久久久久久久久久久| 国产伦精品一区二区三区视频黑人| 亚洲一区二区在线看| 奶水喷射视频一区| 欧美成人在线免费视频| 亚洲国产日韩综合一区| 欧美ed2k| 99re66热这里只有精品4| 午夜精品久久久久影视 | 亚洲国产欧美精品| 一本色道综合亚洲| 国产精品卡一卡二卡三| 亚洲欧美日韩国产另类专区| 久久久九九九九| 亚洲国产精品v| 欧美黄污视频| 亚洲一区精品在线| 免费在线观看成人av| 亚洲美女av网站| 国产精品久久久久一区二区三区| 香蕉视频成人在线观看| 欧美二区在线| 先锋影音久久| 亚洲国产日韩欧美一区二区三区| 欧美猛交免费看| 午夜精品在线看| 亚洲国产精品福利| 欧美有码视频| 亚洲精品综合| 国产午夜一区二区三区| 欧美成人久久| 欧美一区二区三区日韩| 91久久精品久久国产性色也91| 性做久久久久久久免费看| 亚洲高清免费在线| 国产精品综合色区在线观看| 欧美成人蜜桃| 久久精品亚洲一区| 亚洲手机在线| 亚洲日本成人| 免费人成精品欧美精品| 亚洲欧美综合网| 亚洲精品一二区| 红桃视频一区| 国产日韩精品综合网站| 欧美日韩一区二区免费在线观看 | 久久久久国产成人精品亚洲午夜| 99re6这里只有精品| 老司机精品导航| 欧美亚洲尤物久久| 亚洲视频在线视频| 亚洲三级免费观看| 韩国av一区二区| 国产一区二区看久久| 国产精品久久午夜| 欧美日韩在线播放三区| 欧美国产亚洲另类动漫| 久久伊人亚洲|