Jerasure库接口简介及性能测试
Jerasure庫提供Reed-Solomon和Cauchy Reed-Solomon兩種編碼算法的實現.
Reed-Solomon編解碼接口
1. 編碼矩陣生成
??? // generate matrix, last m rows? matrix = talloc(int, m*k);
? for (i = 0; i < m; i++) {
???? for (j = 0; j < k; j++) {
???? matrix[i*k+j] = galois_single_divide(1, i ^ (m + j), w);
???? }
? }?
2. 編碼接口
void jerasure_matrix_encode(int k, int m, int w, int *matrix,? char **data_ptrs, char **coding_ptrs, int size)
- k: 數據塊個數
- m: 校驗塊個數
- w: WORD SIZE
- matrix:編碼矩陣 (m*k,上面的k*k為單位陣)
- data_ptrs:數據塊指針 (長度為k的指針數組)
- coding_ptrs:校驗塊指針(長度為m的指針數組)
- size:數據塊大小(必須是sizeof(long)的倍數)
3. 解碼接口
根據存活的塊,恢復出所有的數據塊,如果有校驗塊丟失,最后會根據數據塊計算出對應的校驗塊。
int jerasure_matrix_decode(int k, int m, int w, int *matrix, int row_k_ones, int *erasures, char **data_ptrs, char **coding_ptrs, int size)
- k: 數據塊個數
- m: 校驗塊個數
- w: WORD SIZE
- matrix:編碼矩陣 (m*k,上面的k*k為單位陣)
- row_k_ones: 編碼的第一行是否全為1,用于優化
- erasueres: 記錄哪些塊丟失了,長度超過m則不能恢復,以-1做為結束標識
?????? erasures[1] = 3; // 第3個塊丟失
?????? erasures[2] = -1; // -1, 結束標識
- data_ptrs:數據塊指針
- coding_ptrs:校驗塊指針
- size:數據塊大小(必須是sizeof(long)的倍數)
4. 恢復指定塊
如果只丟失一個數據塊,要運用3中的接口,則必須獲取到前k個存活的塊;要想使用任意K個塊恢復丟失的某個數據,可先根據存活的塊,計算出解碼矩陣,運用矩陣乘法恢復出指定塊的數據。
int jerasure_make_decoding_matrix(int k, int m, int w, int *matrix, int *erased,? int *decoding_matrix, int *dm_ids)
- k: 數據塊個數
- m: 校驗塊個數
- w: WORD SIZE
- matrix:編碼矩陣 (m*k,上面的k*k為單位陣)
- erased:記錄哪些塊丟失,1代表存活,0代表丟失
????? erased[0] = 1; // 第0個塊丟失
????? erased[1] = 1; // 第1個塊丟失
decoding_matrix: 解碼矩陣(輸出) dm_ids: 存儲的數據塊 (輸出)
void jerasure_matrix_dotprod(int k, int w, int *matrix_row,
int *src_ids, int dest_id, char **data_ptrs, char **coding_ptrs, int size)
- k: 數據塊個數
- w: WORD SIZE
- matrix_row:解碼矩陣,使用上一步的輸出decoding_matrix
- src_ids: 運用哪些塊計算,直接使用上一步的輸出dm_ids
- dest_id: 計算目標塊號
- data_ptrs: 數據塊指針
- coding_ptrs: 校驗塊指針
- size: 數據塊大小
Cauchy Reed-Solomon編解碼接口
接口及使用方式與Reed-Solomon的類似,對應的接口分別為:
- jerasure_bitmatrix_encode // 編碼
- jerasure_bitmatrix_decode // 解碼
- jerasure_make_decoding_bitmatrix // 生成解碼矩陣
- jerasure_bitmatrix_dotprod // 矩陣相乘,計算指定行的數據
不同的是,Cauchy Reed-Solomon使用的編碼矩陣需要先經過轉化。
int *jerasure_matrix_to_bitmatrix(int k, int m, int w, int *matrix)
- k: 數據塊個數
- m: 校驗塊個數
- w: WORD SIZE
- matrix:RS編碼矩陣 (m*k,上面的k*k為單位陣)
返回值即為Cauchy Reed-Solomon的編碼矩陣。
編解碼性能測試
使用Reed-Solomon(RS)和Cauchy Reed-Solomon(CRS)分別進行編解碼測試。
Intel(R) Xeon(R) CPU E5310 @ 1.60GHz 4 cores
1. 編碼不同大小的數據
上圖為使用RS和CRS分別編解碼1M-10M大小的數據,可以看出,編碼的時間與編碼數據大小成正比,并且編解碼的時間基本相同,使用RS編碼1M的數據耗時約為114ms,使用CRS編碼1M的數據耗時約為37ms。
2. 采用不同的WORD SIZE編碼
上圖為RS和CRS分別使用WORD SIZE為8、16、32來編解碼1M的數據(RS、CRS要求m+k<2^w),RS在WORD SIZE為16時性能最佳,而CRS在WORD SIZE為8時性能最佳。
3. 采用不同的數據塊數
上圖為RS和CRS在數據塊數分別為4-10,校驗塊數為2(容2錯)的情況下編解碼1M的數據,可以看出,數據塊數越多(存儲成本越低),編解碼時間越長。
4. CRS采用不同的packet size
上圖為CRS在不同的packet size情況下編解碼1M的數據(RS無此參數, CRS要求size % (w * packet_size) == 0),可以看出,但packet size較小時,packet size的增加極大的降低了編解碼的時間,而當packet size增加至1024及以上時,packet size的增加對編解碼時間影響不大。
轉載于:https://www.cnblogs.com/yunnotes/archive/2013/04/19/3032308.html
總結
以上是生活随笔為你收集整理的Jerasure库接口简介及性能测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 各种网盘体验对比
- 下一篇: 图像对象paip.Image对象出现“对