• <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>

            HashCrack程序數據及索引設計2

             

             

            上個月寫了《HashCrack程序數據及索引設計》里面已經提到早期設計的幾種存儲方法,最后達到了每條記錄15個字節左右的水平,但這個存儲效果還是很差的,而且是單體文件,受制于內存限制,后來又設計了幾種復合索引格式,支持1萬億記錄一個復合索引,下面簡單講講之后的研究成果。

            6、將內容區和索引區合并,索引位置不再提供指向內容區的size_t,內容區不再需要,直接在索引區,這樣索引區indexnode

            Struct indexnode

            {

                    Size_t nextoffset;

                    Char str[0];

            };

            經過此修改之后稍微不好的地方就是如果一個文件里面要管理不同長度的字符串那么只能取最長的字符串長度,以便indexnode保持相同大小容易索引。

            這種方法雖然效果不錯,但平均下來一個字符串還是要占用11個左右的字節,而且不同長度的字符串有一些浪費的地方。

             

            7、以上的存儲方法雖然已經比較緊湊,但還不是最緊湊的方法,如果不保存字符串只是保存字符串在序列中的位置,那么不同字符串也沒有長度不同,也可以用同樣的大小去保存,如果一個db保存42億以下的字符串,那么只要4個字節就可以了,如果一個db保存1萬億以下的數據,那么只要5個字節就可以,這真是個非常有創意的想法,其實我當初想到這個想法的時候很擔心計算效率,遲遲沒有動手代碼,但思考了幾天之后打消了我對效率的擔心,相反,只保存一個position比復制N個字符串可能還要快一點,這樣我們就只要9個字節描述indexnode了,看定義:

            Struct indexnode

            {

                    Size_t lpos;

                    Byte hpos;

                    Size_t nextoffset;

            };

            精確到9個字節表示一條記錄,很不錯,也沒有更多的限制。事實上9字節版本的速度比方法6的確是要快一點,還沒優化的時候就比6方法要快一些了,當然查詢的時候由于要多計算一些信息,理論上是要慢一點的,但由于都是內存計算,其實影響不是很大。

             

            8、上述9個字節的方法雖然已經很緊湊,但如果給nextoffset做一點限制,讓一個區段的數據為1667w以下,那么描述nextoffset 只需要3個字節即可,這樣indexnode總的長度就只需要8個字節,這真是很好的想法,我為這個想法驕傲,看下indexnode8字節版本

            Struct indexnode

            {

                    Size_t lpos;

                    Size_t hpos:8;

                    Size_t nextoffset:24;

            };

            精確的8字節indexnode,如此我們最終實現了最緊湊的md5數據庫,每條記錄8個字節,幾乎無法再減少了,期待哪天突然靈光閃現再創造出更緊湊的存儲方法吧,呵呵,這個實現其實已經超越了我最初的估計了,我以為能減少到12個字節已經到頂了,沒想到還能減少到8個字節。

            8字節的版本最初寫出來的時候效率下降得很厲害,因為以前nextoffset當指針用,現在3個字節無法當指針,只能轉換,多一個轉換函數效率下降了一些,其他地方剛寫的時候也是非優化算法,所以第一個8字節版本效率比9字節降低了一半以上,但花了一個早上優化之后效率又上去了,現在制造復合索引只需要82秒就可完成1億條記錄,速度比方法6快不少,方法6需要120秒左右。

             

            或許我講得比較簡單,如果不是深入研究這一塊的人或許看不明白,但精華我基本上講出來了,實現上其實有很多技巧,如果要做到象我一樣的速度其實是需要很深功力的,我測試用的機器是朋友的入門級服務器E5504 2.0cpu4G內存,普通7200轉硬盤。

            Posted on 2010-10-03 14:19 袁斌 閱讀(175) 評論(0)  編輯 收藏 引用
            久久久青草久久久青草| 91精品久久久久久无码| 亚洲国产视频久久| 久久只有这里有精品4| 国产精品99久久久精品无码| 国产精品免费看久久久| 精品久久久久久亚洲| 久久久久无码专区亚洲av| 综合久久给合久久狠狠狠97色| 日韩人妻无码一区二区三区久久 | 欧美激情精品久久久久久| 中文字幕精品无码久久久久久3D日动漫 | 亚洲精品国产第一综合99久久| 久久大香香蕉国产| 亚洲国产成人精品无码久久久久久综合 | 久久久久AV综合网成人| 久久综合成人网| 亚洲国产欧洲综合997久久| 国产精品午夜久久| 精品国产乱码久久久久久1区2区| 亚洲乱码日产精品a级毛片久久| 久久精品亚洲一区二区三区浴池 | 久久996热精品xxxx| 99久久精品国内| 久久精品国产2020| 伊人久久五月天| 久久亚洲精品无码观看不卡| 97久久精品人妻人人搡人人玩| 97久久婷婷五月综合色d啪蜜芽| 久久天天躁狠狠躁夜夜不卡| 久久久青草青青亚洲国产免观| 日本久久久久久久久久| 久久久精品午夜免费不卡| 久久亚洲春色中文字幕久久久| 久久亚洲中文字幕精品一区| 久久国产精品免费| 国产精品成人99久久久久 | 久久亚洲AV成人无码电影| 伊人久久大香线蕉综合网站| 久久中文字幕视频、最近更新| 久久亚洲国产精品123区|