读 LBFS 有感

LBFS 有感

         LBFS解决在低带宽的前提下如何实现一个文件系统。其的大致思路如下,对文件进行分片,寻找出客户端与服务器端不同的片,只传输差异的文件片,在客户端和服务器端重新合成文件进行保存。

         文件片的计算方法采用的是CDC算法,实验中采用8KBchunk size48B的滑动窗口。该算法需要仔细研究下。在LBFS的另一个作者的pastwatch项目中,有该算法源码,好好研究下。

         无论在客户端还是服务器端,LBFS利用文件片实现的是在所有文件中查找是否相同片。这个就带来了一个问题,文件片所形成的HASH表将十分巨大。以1G的数据量为例,8KB的数据片大小,那么需要131072HASH值,简化为10W。如果数据量增加到1TB那么需要10W*1000 = 10亿个HASH值。这里假设了1TB数据中所有的8KB数据块都不相同,需要10亿个HASH来标示数据块。这个假设具有一定的合理性,因为现在的存储系统支持几十个TB,甚至上百TB容量,在这样的存储容量下1TB的数据以8KB为单位不重复是很有可能。这时对于10亿个HASH值的高速检索和存储需要解决。

         LBFS服务器在存储文件时,如上传一个新的文件,如果该文件与存储系统中的已有块,有相同块,那么将不传输相同块。但是LBFS将直接复制相同块到新文件中,从而形成一个新的文件。LBFS的该做法并不能减少服务器端存储所占用的空间。不过该做法有一个极大的好处,不用单独的存储文件片,文件片存在于需要保存的文件中,文件片的HASH值以及偏移量,长度等信息会指明该文件片。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是 C++ 代码实现: ```cpp #include<iostream> #include<queue> using namespace std; // 邻接表存储结构 #define MAX_VERTEX_NUM 100 typedef struct ArcNode { int adjvex; // 该弧指向的顶点的位置 struct ArcNode *nextarc; // 指向下一条弧的指针 //InfoType info; // 网的边权值 } ArcNode; typedef struct VNode { char data; // 顶点信息 ArcNode *firstarc; // 指向第一条依附该顶点的弧的指针 } VNode, AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; int vexnum, arcnum; // 图的当前顶点数和弧数 } LGraph; // 邻接矩阵存储结构 #define INFINITY INT_MAX typedef struct { char vexs[MAX_VERTEX_NUM]; // 顶点向量 int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵,可看作边表 int vexnum, arcnum; // 图的当前顶点数和弧数 } MGraph; // 邻接表表示的图的递归深度优先遍历 void DFS(LGraph g, int i, int *visited) { visited[i] = 1; cout << g.vertices[i].data << " "; ArcNode *p = g.vertices[i].firstarc; while (p != NULL) { if (visited[p->adjvex] == 0) { DFS(g, p->adjvex, visited); } p = p->nextarc; } } void LDFS(LGraph g, int i) { int visited[MAX_VERTEX_NUM] = { 0 }; DFS(g, i, visited); } // 邻接矩阵表示的图的递归深度优先遍历 void MDFS(MGraph g, int i, int *visited) { visited[i] = 1; cout << g.vexs[i] << " "; for (int j = 0; j < g.vexnum; j++) { if (g.arcs[i][j] != 0 && visited[j] == 0) { MDFS(g, j, visited); } } } void MDFS(MGraph g, int i) { int visited[MAX_VERTEX_NUM] = { 0 }; MDFS(g, i, visited); } // 邻接表表示的图的广度优先遍历 void LBFS(LGraph g, int s) { queue<int> q; int visited[MAX_VERTEX_NUM] = { 0 }; visited[s] = 1; cout << g.vertices[s].data << " "; q.push(s); while (!q.empty()) { int v = q.front(); q.pop(); ArcNode *p = g.vertices[v].firstarc; while (p != NULL) { if (visited[p->adjvex] == 0) { visited[p->adjvex] = 1; cout << g.vertices[p->adjvex].data << " "; q.push(p->adjvex); } p = p->nextarc; } } } // 邻接矩阵表示的图的广度优先遍历 void MBFS(MGraph g, int s) { queue<int> q; int visited[MAX_VERTEX_NUM] = { 0 }; visited[s] = 1; cout << g.vexs[s] << " "; q.push(s); while (!q.empty()) { int v = q.front(); q.pop(); for (int j = 0; j < g.vexnum; j++) { if (g.arcs[v][j] != 0 && visited[j] == 0) { visited[j] = 1; cout << g.vexs[j] << " "; q.push(j); } } } } // 建立图的邻接表 void Create_Graph(LGraph &g, MGraph &mg) { // 邻接表 g.vexnum = mg.vexnum; g.arcnum = mg.arcnum; for (int i = 0; i < mg.vexnum; i++) { g.vertices[i].data = mg.vexs[i]; g.vertices[i].firstarc = NULL; } for (int i = 0; i < mg.vexnum; i++) { for (int j = 0; j < mg.vexnum; j++) { if (mg.arcs[i][j] != 0) { ArcNode *p = new ArcNode; p->adjvex = j; p->nextarc = g.vertices[i].firstarc; g.vertices[i].firstarc = p; } } } // 邻接矩阵 for (int i = 0; i < mg.vexnum; i++) { for (int j = 0; j < mg.vexnum; j++) { if (mg.arcs[i][j] == INFINITY) { mg.arcs[i][j] = 0; } } } } int main() { LGraph lg; MGraph mg; // 初始化邻接矩阵 mg.vexnum = 5; mg.arcnum = 7; for (int i = 0; i < mg.vexnum; i++) { for (int j = 0; j < mg.vexnum; j++) { mg.arcs[i][j] = INFINITY; } } mg.vexs[0] = 'A'; mg.vexs[1] = 'B'; mg.vexs[2] = 'C'; mg.vexs[3] = 'D'; mg.vexs[4] = 'E'; mg.arcs[0][1] = 1; mg.arcs[0][2] = 1; mg.arcs[1][2] = 1; mg.arcs[1][3] = 1; mg.arcs[2][0] = 1; mg.arcs[2][3] = 1; mg.arcs[3][4] = 1; // 建立邻接表 Create_Graph(lg, mg); // 邻接表表示的图的递归深度优先遍历 LDFS(lg, 0); cout << endl; // 邻接矩阵表示的图的递归深度优先遍历 MDFS(mg, 0); cout << endl; // 邻接表表示的图的广度优先遍历 LBFS(lg, 0); cout << endl; // 邻接矩阵表示的图的广度优先遍历 MBFS(mg, 0); cout << endl; return 0; } ``` 注意:以上代码只是一种实现方法,不一定是最优的。在实际应用中,还需要考虑图的具体特征和需求,选择合适的存储结构和算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值