Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >大文件的存储和备份

大文件的存储和备份

作者头像
林德熙
发布于 2018-09-18 11:54:12
发布于 2018-09-18 11:54:12
3.7K0
举报
文章被收录于专栏:林德熙的博客林德熙的博客

今天我和大家讲一个算法,这个算法用于大量的文件存储和高速读取、备份。

大概这个算法是现在世界上最好的存储算法之一,原因是他的论文发在 SCI 上,现在还没有人写出一个比他好的算法。

SCI 是国际论文最顶级的发布地,所以质量还是可以相信。这个算法是理论上最好,实际使用可能需要修改好多。

因为我们公司遇到一个存储上的困难,做的产品好像是 PPT 一样的,但是要把所有的数据存放到自己的服务器,那么如何存在服务器可以让大量的用户存放不会出现明显的卡顿和已经存放了大量的数据,如何快速读取用户想要的数据。这就是我看到的问题。

因为我不是负责这一块,但我听说我师兄之前讲个的这个算法,于是拿过来用,至于是不是一个好的算法,我也不知道。

在实验室,可以不知道产品是怎样,设计出一个算法,并且说这是一个好的算法。但是在实际的开发,必须知道产品的需求,于是就不能直接使用算法,需要对算法进行修改。

看过 Hadoop 的算法,原来的 Hadoop 是不建议人们对传上去的文件修改。但实际上,可能是存在经常修改的文件。对于 Hadoop ,难以做历史记录,后来我问过另一个师兄,他说是可以做到的,不过渣渣不懂师兄说的如何做。

于是我想做的是一个支持修改的存储,可以无限历史还原,可以快速读取的系统。于是参见了惠普使用的方法,和之前听说的方法。这个方法没有实际去试,所以好不好,我也不敢说。

惠普的方法,主要是文件分块,其它的是如何存储。文件分块是为了:方便存储,第二是方便修改后的存储。这里需要说一些,对于一个很大的文件,需要把他分为多个小文件存储,不能自己存放大的文件。原因是当修改一个很大的文件一小点,如果不把一个大文件分块,就需要上传整个文件。一旦把文件分块,那么可以上传修改的块就好,至于修改上传的块之后如何去更新,这个在下面会说到。文件的分块不是可以随意分的,需要考虑分块的大小和分块之后是不是一次修改刚好会修改在多个块而不是在一个块。

那么我的文件分块是不是最难的,其实相反,文件分块是最简单的,刚好产品是PPT差不多的样子,一个页就可以分一块。

那么来说下算法是如何做:第一步,按照文件页,把文件分为多块。注意,这里的分块和存储的分块不是一样的,文件存储分块的层和他不在同一层。第二步,生成每个页的 ID ,生成的方法可以使用 sha 或 MD5加上作者和文件信息。注意,生成的 ID 是在全局要求极低的重复率。

那么存储的文件是什么,其实是一些 ID 。

如果要获取文件,那么首先需要存储的是文件的 ID ,然后系统提供输入 文件的 ID 返回文件内容块 ID 的 API 。于是文件 ID 就可以获取文件块 ID 。系统还有一个 API ,输入文件块 ID 就可以获得文件块内容,于是可以用这个方法来获得文件。需要说的是,第一个 API ,返回文件块 ID 的那个 API 和第二个 API 其实是相同的。只是第一个 API 把文件块 ID 存储为内容,第二个 API 是把文件内容存储为内容。

这么做的好处:

  • 用户经常的修改只有修改某些页,而且很多的文件都使用复制粘贴页,所以存在页的重复比较多,存储可以复用比较多。实际使用,我是推荐去挖掘一下一个用户存放的 文件 相同最多是什么,和所有用户存放的文件相同最多的是什么,这样来分块会比较好。

文件知道他的内容 ID ,不知道他的实际内容,于是多个文件存在相同的页面就会在系统只存在一个块,一个块提供多个文件引用。

  • 对于用户修改某些页,可以通过上传用户更新的页,然后修改文件ID包含文件块ID的顺序等来更新文件。

如果用户文件ID包含了历史记录的属性,那么只需要把历史记录设为前一个版本的ID就好了,因为前一个版本的ID就记录了他的文件内容ID,这样可以只需要更新版本ID和更新内容ID就好了。

实际上因为和业务需求不同,所以这个算法是没有效率的。所有的文件都是小文件,假如有1k,里面重复最大的页只有 200b ,但是一个 ID ,其它的页,最小的只有 10b 于是,存 ID 的数据就比存数据的,有时候要大得多,所以这个方法最后不使用。

参见:

惠普使用的方法:http://www.hpl.hp.com/techreports/2005/HPL-2005-30R1.html

https://www.computer.org/csdl/trans/tc/2011/06/ttc2011060824-abs.html


本文会经常更新,请阅读原文: https://lindexi.gitee.io/lindexi/post/%E5%A4%A7%E6%96%87%E4%BB%B6%E7%9A%84%E5%AD%98%E5%82%A8%E5%92%8C%E5%A4%87%E4%BB%BD.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何删除错误提交的 git 大文件
早上小伙伴告诉我,他无法拉下代码,我没有在意。在我开始写代码的时候,发现我的 C 盘炸了。因为我的磁盘是苏菲只有 256G 放了代码就没空间了,于是我查找到了原来是我的代码占用了居然有 2000+M ,寻找了很久才发现,原来我小伙伴JAKE传了一个压缩包上去,一个1G的包。 那么如何把这个压缩包彻底从 git 删除?
林德熙
2018/09/18
3.3K0
如何删除错误提交的 git 大文件
业界 | 每天1.4亿小时观看时长,Netflix怎样存储这些时间序列数据?
大数据文摘作品 编译:丁慧、笪洁琼、蒋宝尚 网络互联设备的增长带来了大量易于访问的时间序列数据。越来越多的公司对挖掘这些数据感兴趣,从而获取了有价值的信息并做出了相应的数据决策。 近几年技术的进步提高了收集,存储和分析时间序列数据的效率,同时也刺激了人们对这些数据的消费欲望。然而,这种时间序列的爆炸式增长,可能会破坏大多数初始时间序列数据的体系结构。 Netflix作为一家以数据为驱导的公司,对这些挑战并不陌生,多年来致力于寻找如何管理日益增长的数据。我们将分享Netflix如何通过多次扩展来解决时间序列
大数据文摘
2018/05/23
1.4K0
VisualStudio 使用新项目格式快速打出 Nuget 包
本文告诉大家如何通过 VisualStudio 的新项目格式快速打出 Nuget 包
林德熙
2019/03/13
7540
VisualStudio 使用新项目格式快速打出 Nuget 包
Nuget 通过 dotnet 命令行发布
在开发完成一个好用的轮子就想将这个轮子发布到 nuget 让其他小伙伴可以来使用,但是 nuget.org 的登陆速度太慢,本文介绍一个命令行发布的方法,通过命令行发布的方法可以配合 Jenkins 自动打包
林德熙
2019/03/13
6140
Nuget 通过 dotnet 命令行发布
上传代码 CodePlex 注册新建项目上传代码Page
CodePlex是微软开源项目网站,有很多人都在上面传代码,我们也可以上传自己的代码
林德熙
2018/09/18
8830
上传代码 CodePlex
            注册新建项目上传代码Page
Hadoop部署配置及运行调试(中)
此篇章主要介绍Hadoop完全分布式模式的部署。完全分布式模式是利用多台服务器来进行部署Hadoop,是真正意义上的分布式部署模式。此模式下,Hadoop的守护进程分别运行在由多个主机节点搭建的服务器集群上,不同的节点担任不同的角色。该模式一般用于部署构建企业级Hadoop系统,实际的工作应用开发中也经常使用此模式。
数人之道
2022/01/07
8300
Hadoop部署配置及运行调试(中)
大文件上传和断点续传_文件断点续传实现的思路
支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验;
全栈程序员站长
2022/09/21
2K0
大文件上传和断点续传_文件断点续传实现的思路
WPF 从文件创建图片的方法
如果直接通过文件的 URL 创建,那么可能出现文件被占用的问题,不能比较好做文件的修改,建议通过内存的方式加载
林德熙
2019/03/13
1.5K0
VisualStudio 扩展开发 添加菜单
本文告诉大家如何快速在开发 VisualStudio 的工具里面添加菜单,点击菜单运行自己的代码
林德熙
2019/03/13
7780
VisualStudio 扩展开发 添加菜单
dotnet core 通过 frp 发布自己的网站 搭建本地网站配置域名配置代理
很多时候写出来的网站只能自己内网访问,本文告诉大家如何通过 Frp 将自己的 asp dotnet core 网站发布到外网,让小伙伴访问自己的网站 通过 frp 的方式,可以解决自己的服务器性能太差的问题,通过 frp 的方式需要先存在一个外网的服务器
林德熙
2019/03/13
1.9K0
dotnet core 通过 frp 发布自己的网站
            搭建本地网站配置域名配置代理
3分钟教你搭建 gitea 在 Centos 服务器
本文告诉大家如何在一个 Centos 服务器上搭建 gitea 然后在 gitea 创建帐号上传代码
林德熙
2019/03/13
2.4K0
dotnet core 使用 sqlite 部署到 Centos 服务器 创建项目创建模型安装 Sqlite设置连接部署服务器
本文告诉大家如何创建一个 asp dotnet core 程序,这个程序使用 sqlite 保存,部署程序到 Centos 7 服务器
林德熙
2019/03/13
1.2K0
dotnet core 使用 sqlite 部署到 Centos 服务器
            创建项目创建模型安装 Sqlite设置连接部署服务器
规模化时间序列数据存储(第一部分)
引言 因特网互联设备的发展,提供了大量易于访问的时序数据。越来越多的公司有兴趣去挖掘这类数据,意图从中获取一些有意义的洞悉,并据此做出决策。技术的最新进展提高了时序数据的收集、存储和分析效率,激发了人们对如何处理此类数据的考量。然而,大多数现有时序数据体系结构的处理能力,可能无法跟上时序数据的爆发性增长。 作为一家根植于数据的公司,Netflix已习惯于面对这样的挑战,多年来一直在推进应对此类增长的解决方案。该系列博客文章分为两部分发表,我们将分享Netflix在改进时序数据存储架构上的做法,如何很好地应对
用户1263954
2018/05/30
7940
如何存储 Git 大文件?
作者:terryshchen,腾讯 IEG 应用开发工程师 本文主要讲解在 Git 仓库中如何管理大的二进制文件,详细介绍了什么是 Git LFS,Git LFS 是如何工作的,以及如何使用 Git LFS。 本文翻译自 Atlassian 官方介绍 Git LFS 的文章,Atlassian 是 Git LFS 的主要开发者之一,这篇介绍 Git LFS 的文章比较权威,讲的也很详细。原文地址: https://www.atlassian.com/git/tutorials/git-lfs 本
腾讯技术工程官方号
2020/06/09
3.7K0
盘点分布式文件存储系统____分布式文件存储系统简介
**分布式存储:**通过网络使用企业中的每台机器上的磁盘空间,并将这些分散的存储资源构成一个虚拟的存储设备,数据分散的存储在企业的各个角落。
全栈程序员站长
2022/06/28
6.5K0
盘点分布式文件存储系统____分布式文件存储系统简介
HDFS分布式文件存储系统详解
优点: 1.处理超大文件 能用来存储管理PB级的数据 1PB = 1024TB 2.处理非结构化数据、半结构化数据、结构化数据 流式的访问数据 一次写入、多次读取 3.运行于廉价的商用机器集群上 可运行在低廉的商用硬件集群上 故障时能继续运行且不让用户察觉到明显的中断
全栈程序员站长
2022/08/22
1.6K0
HDFS分布式文件存储系统详解
dotnet core 发布只带必要的依赖文件
在使用 dotnet core 发布独立项目的时候,会带上大量依赖的库,但是通过微软提供的工具可以去掉一些在代码没有用到的库。
林德熙
2019/03/13
1.5K0
如何移动 nuget 缓存文件夹 修改链接配置NuGet CacheNuGet Configuration
本文告诉大家如何移动 nuget 缓存文件夹。 因为 nuget 文件夹一般比较大,现在我的 nuget 文件夹有 10 G,默认的 nuget 文件夹是在C盘,所以需要移动他。
林德熙
2018/09/18
2.3K0
Hadoop(十三)分析MapReduce程序
  刚才发生了悲伤的一幕,本来这篇博客马上就要写好的,花了我一晚上的时间。但是刚才电脑没有插电源就没有了。很难受!想哭,但是没有办法继续站起来。
大道七哥
2019/09/10
6990
Hadoop(十三)分析MapReduce程序
asp dotnet core 支持客户端上传文件
新建一个 asp dotnet core 程序,创建一个新的类,用于给客户端上传文件的信息
林德熙
2019/03/13
6.5K0
推荐阅读
相关推荐
如何删除错误提交的 git 大文件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档