成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Hadoop的一個(gè)變長(zhǎng)long編碼剖析

大數(shù)據(jù) Hadoop
Hadoop對(duì)于long、int (化成long進(jìn)行編碼)的編碼設(shè)計(jì)了自己的一套編碼方式,這是一個(gè)zero-compressed encoded的變長(zhǎng)編碼方式,有利于大大壓縮冗余數(shù)據(jù)。

Hadoop對(duì)于long、int (化成long進(jìn)行編碼)的編碼設(shè)計(jì)了自己的一套編碼方式,這是一個(gè)zero-compressed encoded的變長(zhǎng)編碼方式,有利于大大壓縮冗余數(shù)據(jù)。具體算法其實(shí)很簡(jiǎn)單,具體來(lái)說(shuō)有如下幾點(diǎn):

Hadoop的一個(gè)變長(zhǎng)long編碼剖析

1、對(duì)于-112 <= i <= 127的整數(shù),只用1個(gè)字節(jié)byte來(lái)表示;如果超過(guò)上述范圍時(shí),編碼***個(gè)字節(jié)則會(huì)用來(lái)表示i的總字節(jié)數(shù),后面則跟著 i 的字節(jié);

2、如果i大于0,則編碼的***個(gè)字節(jié) b 范圍在-113和-120之間,則 i 會(huì)有 (-112 - b)個(gè)字節(jié),所以可以表示有1-8個(gè)字節(jié);

3、如果i小于0,則編碼***個(gè)字節(jié) b 范圍在 -121 和 -128之間,則 i 會(huì)有 (-120 - b)個(gè)字節(jié),同樣也可以表示有1-8個(gè)字節(jié)。(Hadoop的實(shí)現(xiàn)里,當(dāng)i為負(fù)數(shù)被編碼的是 i 補(bǔ)碼)。

算法看上去比較容易理解,具體要點(diǎn)就是利用***個(gè)字節(jié)表示 i 的長(zhǎng)度,以及 i 的符號(hào),不過(guò)其實(shí),如果深入源碼后,發(fā)現(xiàn)Hadoop的實(shí)現(xiàn)有點(diǎn)小巧妙的地方,我們先看代碼的實(shí)現(xiàn):

首先是變長(zhǎng)long的編碼:

public static void writeVLong(DataOutput stream, long i) throws IOException { if (i >= -112 && i <= 127) { stream.writeByte((byte)i); return; } int len = -112; if (i < 0) { i ^= -1L; // take one's complement' //關(guān)鍵部分! 替換做法是 i = -i; len = -120; } long tmp = i; while (tmp != 0) { tmp = tmp >> 8; len--; } stream.writeByte((byte)len); len = (len < -120) ? -(len + 120) : -(len + 112); for (int idx = len; idx != 0; idx--) { int shiftbits = (idx - 1) * 8; long mask = 0xFFL << shiftbits; stream.writeByte((byte)((i & mask) >> shiftbits)); } }

為了方便,我這里也貼上自己稍微簡(jiǎn)化了Hadoop實(shí)現(xiàn)的解碼變長(zhǎng)long的實(shí)現(xiàn):

public static long readVLong(DataInputStream input) throws IOException { byte firstByte = input.readByte; int len = -112; boolean isNegative = false; if (firstByte >= -112 && firstByte <= 127) { return firstByte; } else if (firstByte <= -121) { len = -120; isNegative = true; } len = len - firstByte; long res = 0; for (int i = 0; i < len; ++i) { res <<= 8; byte b = input.readByte; res = (b & 0xFF) | res; } //如果編碼是i = -i; 則這里是return isNegative ? (-res) : res; return isNegative ? (res ^ -1L) : res; } 算法的具體實(shí)現(xiàn)部分,參照之前概括的描述很容易了解大致框架,但有一個(gè)很關(guān)鍵的部分,就是在添加了注釋的編碼和解碼的部分,對(duì)于算法第3個(gè)條件里,如果 i 為負(fù)數(shù)的時(shí)候,Hadoop的默認(rèn)實(shí)現(xiàn)里會(huì)把 i 進(jìn)行補(bǔ)碼運(yùn)算,然后再繼續(xù)執(zhí)行編碼,而因此,在解碼的時(shí)候,***部分也要重新取一個(gè)補(bǔ)碼操作。

算法思想分析

為什么要這樣呢?其實(shí)分析一下整個(gè)算法的原理。首先如果我們簡(jiǎn)單的把***個(gè)字節(jié)表示 i 的字節(jié)數(shù),不分為正、負(fù)兩個(gè)部分來(lái)額外表示符號(hào)的話(huà),這樣會(huì)出現(xiàn)一個(gè)問(wèn)題:那就是會(huì)沒(méi)辦法通過(guò)變長(zhǎng)編碼簡(jiǎn)單實(shí)現(xiàn)正負(fù)判斷,舉個(gè)簡(jiǎn)單的例子,對(duì)于 i = 128和 i = -128,這兩個(gè)數(shù)的編碼對(duì)于1個(gè)字節(jié)來(lái)說(shuō),都是0x80!為什么會(huì)這樣呢?如果想到負(fù)數(shù)的二進(jìn)制編碼是正數(shù)取反后加1(加1是為了避免直接取反對(duì)0進(jìn)行 兩次編碼,這樣負(fù)數(shù)能夠多表示1個(gè)數(shù)),因此,對(duì)于給定的字節(jié),負(fù)數(shù)總是會(huì)比正數(shù)多表示1個(gè)數(shù),對(duì)于1個(gè)字節(jié),能表示-128~127。因此對(duì)于 i = 128的時(shí)候,沒(méi)辦法分辨出正負(fù),必須要靠***個(gè)字節(jié)添加符號(hào)信息。

當(dāng)給***個(gè)字節(jié)多分8個(gè)數(shù)出來(lái)表示符號(hào)的時(shí)候,為了要計(jì)算 i 的位數(shù),如果 i 為負(fù)數(shù)的時(shí)候,i 的高位則全為1, 因此必須要對(duì) i 為負(fù)數(shù)的情況取反,然后再不斷循環(huán)計(jì)算 i 的長(zhǎng)度,但事實(shí)上,我們同樣也可以對(duì) i 取反后加1,也就是對(duì) i = -i;轉(zhuǎn)為絕對(duì)值,而事實(shí)上,經(jīng)過(guò)本人的測(cè)試,無(wú)論是取反或者是做絕對(duì)值操作,兩者均可以正常進(jìn)行編碼解碼,但事實(shí)上,取反有一個(gè)好處,對(duì)于i = -256的時(shí)候,如果將 i 取反,則會(huì)編碼輸出的兩個(gè)字節(jié)為:-121,-1。如果將 i 取絕對(duì)值,則編碼輸出的兩個(gè)字節(jié)為:-122,1,0。可見(jiàn),對(duì)于這種的時(shí)候,取反能夠比取絕對(duì)值少用1個(gè)字節(jié)。

 
責(zé)任編輯:王雪燕
相關(guān)推薦

2017-06-27 08:41:04

JVM設(shè)計(jì)缺陷GC

2024-09-29 15:15:46

2014-07-21 10:25:12

ENode開(kāi)發(fā)論壇

2012-05-10 16:32:01

Hadoop

2021-01-28 07:21:13

算法虛擬DOM前端

2011-06-02 10:37:02

Android 對(duì)話(huà)框

2010-06-03 13:08:51

2010-11-29 15:35:36

云計(jì)算經(jīng)濟(jì)學(xué)

2012-06-01 16:13:09

Hadoo大數(shù)據(jù)

2021-04-01 13:07:07

編碼開(kāi)發(fā)代碼

2020-12-07 06:26:32

模式交付工作

2022-05-12 09:22:16

Memray內(nèi)存剖析器開(kāi)源

2010-03-05 15:02:09

Linux文件編碼

2020-03-27 09:24:39

程序員技能開(kāi)發(fā)者

2022-02-14 07:19:43

數(shù)據(jù)中臺(tái)業(yè)務(wù)中臺(tái)雙中臺(tái)

2016-09-26 17:26:20

2024-04-15 00:00:00

LongBigDecimal運(yùn)算

2010-06-03 11:23:19

Hadoop

2017-06-07 12:49:21

2011-06-17 10:29:04

Nodejavascript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美精品一区二区三区在线播放 | 激情的网站 | 天天草天天操 | 另类二区 | 亚洲精品久久久久中文字幕欢迎你 | 国产伦精品一区二区三毛 | 一区二区中文 | www久久国产| 高清欧美性猛交xxxx黑人猛交 | 成年男女免费视频网站 | 黄色片免费看视频 | 国产精品久久久久久久久久久久 | 亚洲精品久久久蜜桃 | 隔壁老王国产在线精品 | 一区二区三区国产 | 毛片一级片 | 福利一区二区在线 | 中文字幕日韩欧美一区二区三区 | 久久久久成人精品 | 日韩在线观看 | 老牛影视av一区二区在线观看 | 一级二级三级在线观看 | 欧美精品免费观看二区 | www.久久| 亚洲综合视频 | 亚洲综合二区 | 97色免费视频 | 欧美大片一区 | 日本一卡精品视频免费 | 日韩精品在线看 | 日韩三区 | 草草网 | 亚洲欧美一区二区三区国产精品 | 一级毛片免费 | 中文字幕不卡在线88 | 欧美日韩亚洲视频 | 国产伦精品一区二区三区在线 | 色婷婷在线视频 | 成人免费视频观看视频 | 亚洲一区二区三区四区五区中文 | 超碰最新在线 |