如何从一个大文件中分离小文件

如何从一个大文件中分离小文件

点点

2021-05-08 20:27 阅读 436 喜欢 0

背景

 facebook目前存储了2600亿张照片,总大小为20PB,每张照片约为80KB。
 用户每周新增照片数量为              
10亿。(总大小60TB),平均每秒新增3500张照片(3500次写请求),读操作峰值可以达到每秒百 
万次。

考虑到一台标配的服务器的硬盘是10TB,理论上可以存 10TB/80KB=1.3亿张左右的照片。

然而linux服务器的文件索引的设计最多只支持500w左右的文件数,如果超过500w,性能会大幅下降。

在普通的linux文件系统中,读取一个文件包括三次磁盘io:首先读取目录元数据到内存,
其次把文件 中的inode节点装载到内存,最后读取实际的文件内容。由于小文件个数太多,
无法将所有的目录以及文 件的inode信息缓存到内存,                                                                                                                                                                                          
因此磁盘IO次数很难达到每个图片读取只需要一次磁盘IO的理想状态。

因此,facebook的图片存储系统haystack设计采用的思路是: 多个逻辑图片文件共享一个物理文件。

 1个物理文件的大小=32MB。因此linux服务器中的文件个数在                                                            
 10TB/32MB=1024*1024/32=327680..远远小于linux服务器的文件索引的阈值。

  照片文件在物理文件中的存放为依次的顺序存放。每个照片文件的存放规格如下:

 - 1字节的标记位。0代表接下来的照片仍然可用,1代表接下来的照片已经被删除,2代表该物理文件接下来已经没有图片了。

 - 4字节的size。标记照片的大小x。

 - x字节,照片文件本身。

实现

文件已经到手,现在的目标是,根据规则,将文件的所有图片解出。

读取,循环,写入即可。

代码:

 var fs = require('fs');

var d = fs.readFileSync('rf.data');
var b = new Buffer(d);
var c = 0;
for(var i=0;i<b.length;){
var start = i;
var flag = b.slice(start,start+1);//获得标志位
flag = getR(flag);
if(flag == 0){
    var size = getR(b.slice(start+1,start+5));
    //将图片输出
    fs.writeFile(c+'.jpg',b.slice(start+5,start+6+size),function(){
        console.log('图片写入完成')
    });
    i = i + 1 + 4 + size;
    c++;
}else if(flag == 1){
    var size =getR( b.slice(start+1,start+5));
    i = i + 1 + 4 + size;
}else if(flag == 2){
    i = b.length;
}
}

function getR ( buf ){
return parseInt(buf.toString('hex'),16);
}

将BUFFER 转成字符串,buffer内为16进制的,转成string ,则调用Buffer.toString('hex');

获得16进制的字符串,然后见字符串转化为10进制的数字

转载请注明出处: http://sdxlp.cn/article/xiaowenjian.html


如果对你有用的话,请赏给作者一个馒头吧 ...或帮点下页面底部的广告,感谢!!

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
手机上的微信软件是我们日常生活中必不可少的通讯软件,在我们聊天的时候免不了要发送照片,那如果我们照片在相册里找不到了怎么办那?点点给小伙伴们一个实用的小技巧。希望可以帮到苦恼的小伙伴们。
生活中会碰到给图片加水印的情况,这时候如果一张一张的添加,会非常麻烦,还会耗费很多的时间,极大的影响工作效率,今天我给大家伙推荐一款工具,非常实用而且简单。现在跟我来看一下,学到即赚到。
现如今智能手机中华为手机成为了主流之一,用华为手机如何保存微信聊天记录?在华为帐号里面,进入到云备份功能,选择好要恢复的微信数据,进行恢复成功即可恢复微信聊天记录。
现在QQ作为国内最常使用的即时通讯软件之一,QQ仍然还是很多小伙伴们日常交友聊天和游戏打怪的必用软件。但如果是在电脑上使用QQ接收文件,又有多少小伙伴们知道,这些接收的QQ文件在电脑哪个文件夹中呢?接下来就让点点,给小伙伴们讲解一下QQ文件保存在电脑的哪里,以及该怎么进行缓存清理吧。
苹果12怎么打开5G?IPhone12系列全部支持5G网络,那我们在使用苹果12手机时,该怎么打开5G网络呢,苹果12怎么打开5G,IPhone125G怎么打开,下面就和点点一起来看看吧!
小伙伴们在使用QQ的过程中,无法避免误删了一些重要的聊天记录,而使用QQ的大多数原因都是因为微信无法传送大存储量的文件,所以很多小伙伴们都会利用QQ来传送文件,手机QQ聊天记录删除了怎么恢复?
系统有好多个,这里说一下miui吧,miui说了很多小伙伴们看不懂,通俗来说就是小米,这样一说小伙伴们就知道啦!miui是一款好用的Android深度定制ROM,在系统中有很多人性化的服务,但是在使用过程中难免会出现一些不好清理的文件,比如说其他文件,这里为各位小伙伴们带来有关的删除方法。下面来跟点点一起看一下吧!
听到好微信的音频,该如何去下载?视频可以去腾讯视频里搜视频名字,可以找得到视频页面链接。音频有两种:音乐就直接去后台搜,如果是录音的那种音频,用以下方法下载。免费保证百分百成功。