百科问答小站 logo
百科问答小站 font logo



能否把1GB的数据压缩到1MB甚至更小的体积? 第1页

  

user avatar   niu-dai-68-44 网友的相关建议: 
      

宏观上说取决于数据的混乱程度,如果数据完全是随机生成的,极限压缩,也几乎压缩不了多少。

反之,如果数据比较有规律,规律性越强,则压缩空间越大。

可能把无限大的数据压缩成一行数据吗?可以。

举个例子,假如有这样一个文本文件:

       135791113151719...     

我们可以把它压缩成:

       a[n+1] = a[n] + 2, a[0] = 1,     

因为在上面的文件中,我们观察到其实是由一个等差数列连接而成的字符串,所以我们可以用通项公式来复现出文件的完整的信息。

再比如更一般的,文本文件中,往往每个字母的出现频率是不一样的,有的字母出现频率更高,有的则更低,如果我们尽可能的让出现频率更高的字母用更少的空间表示,这样就会达到一个数据压缩的效果,常见的典型例子就是哈夫曼编码 (Huffman Encoding)。

哈夫曼编码的原理是找到这么一种二进制编码模式,能让出现频率越高的字符用越短的二进制编码去表示,找到之后,进行编码,从而达到了一种压缩体积的效果,具体操作方法在这里不赘述。

也因为如此,哈夫曼编码能够对文本文件有不错的压缩效果,因为几乎所有文本文件的字符出现频率都是有差异的。

但也正因为如此,用哈夫曼编码去压缩图片,视频等文件,几乎起不到什么效果,因为以文字的角度去看图片文件,几乎可以看作是随机的乱码文件,字符出现的频率近乎一致。

上面所说的这种叫做无损压缩,能够保证压缩后的数据能够完整的复现成原来的数据,它更注重的是“变形”,利用数据已有的规律和特征,去进行一些变形,这本身不矛盾。

“内容“是抽象的,它包含着对我们人类有意义的信息,比如,文章,图片,但存储内容,必须有一个把内容变成数据的过程,数据比内容更为归一化,怎么理解这个归一化呢?不管是图片,还是文章,还是视屏,在 unix 系统下,它们都是以二进制文件的形式存储的,都是一堆 0 和 1,这就叫归一化,把多种内容编码成一种数据,给我们带来了很大的方便,我们只要想办法把数据以某种方式存储到物理介质上,我们就获得了存储所有“内容”的能力,这就像只要所有的网络I/O,文件I/O,块设备,字符设备,都能表现成对一个 fd 的读写,我们知道怎么对 fd 读写,我们就具备了操纵这么多种不同的 I/O 的能力,这个过程往往称之为编码,而数据在物理载体上的存储方式,则有无限种可能。

原来看到一篇科幻小说,好像是刘慈欣写的,说的是一个外星人,来了地球之后,把人类的所有知识都获取了之后,编码成了一串数字,大概就像这样:

       28372493824923923..............很长很长...     

然后这个外星人在第一数之后点了一个小数点,然后又加了个长度单位,索性就是米好了:

       2.8372493824923923..............很长很长...m     

由于这段数字虽然很长很长,但是它是有限的,而且这个外星人有很先进的度量能力,也就是说,他们有非常精密的尺子,即便是上面那么长,他们也能度量出来。

于是,外星人把上面那串数字当成了一段长度,在飞船上找了一个位置,准确的刻画了这段长度,于是,它就用这两个刻度,存储了地球的全部信息。

这听起来很神奇,你竟然能用一个刻度,存储地球的全部知识,当然在现实世界我们知道是不可能的,因为随着小数点后面的数变多,每个数代表的真实大小在指数级的减小,而对我们的衡量精度要求是指数级的增高,我们马上就无能为力了。

于此相同,我们还可以选取一个铁块,把上面的数字单位变成 kg,只要这个铁块的重量严格等于它,我们就用这个铁块,存储了人类的知识。

小学的数列找规律的题,就像是在寻找数据压缩的方式,如果你成功找到了通项公式,你就把这个无限长的数列压缩成了一个公式。

我在文章开头说的,数据的混乱程度,决定了数据压缩的难度,或者说,数据的熵越大,越难压缩,因为它缺乏可预测性,可归一性,没有同质化的区域,更没有可利用的规律,所以也缺乏被总结归纳的可能性。

再说说有损压缩,这方面就很好理解了,但是压缩的时候,往往要和内容紧密联系。

比如,内容是图片,我们压缩的时候,可能考虑降低分辨率,把相邻的四个像素点取一个颜色平均值,然后变成一个像素点,这样,图片的分辨率就被压缩成了原来的四分之一,但是看上去,还能看出原来的样子。

但是如果我们对文本文件做一摸一样的压缩处理,就会发现原来有意义的一篇文章变成了缩短四分之一后的奇怪乱码,这就是从内容的角度上,完全损失了数据。

而对于此,对于图片和文本,我们可以定义不同的压缩损失的函数,从而用来衡量压缩后信息的损失量。

图片具有稳定性,也就是说,将一个像素点的颜色微调一点,对整个图片不会有突变的印象,而对于文本,48 和 49 所代表的字符可能完全是两个字符,所以文本文件很难做有损压缩,而图片等多媒体资源,经常会做不同的压缩等级处理,比方说 720p,1080p,4k 等等。

而对于一堆在高维空间中的样本点来说,我们可以进行降维处理,比方说原有的数据点长这样:

然后你用把所有的数据点都投影在了蓝色的直线上,于是二维的样本点变成了一维的样本点,常见的方法有 PCA (Principle Component Analysis) 等。

谢谢!


user avatar   zhang-hao-72 网友的相关建议: 
      

看你1GB什么数据了

给两个极端例子

dd if=/dev/zero of=zero bs=32768 count=32768

dd if=/dev/random of=random bs=32768 count=32768


user avatar   sms-parry 网友的相关建议: 
      
更新: 关于巨量数据存储的一些小科普。

实际上,压缩和解压需要的运算量是比较大的。

一般情况下,10G的视频能压缩成9G就已经做的很好了。

如果是你有100G, 1T, 100T, 1000T 的东西去解压或者压缩,是很耗费计算资源的。

计算资源的价格远比存储资源(低读写)的价格贵的多。

如果是巨量的数据,连存储机械盘都成本很高的话,一般是用磁带来做存储介质的。



单个成本很低,而且存储可靠性非常高。硬盘始终是有故障率的,可靠度目前业界也就是95%左右,买品质更好的能控制住98%-99%。

磁带可以低成本的进行多个物理备份,维护成本较低,但是如果要恢复数据,肯定是没有硬盘那么方便了。

而且,备份的机器比较贵

目前来说,个人数据存储方案里比较便宜的,最好就是买容量至少1T的机械盘,买两个。一个做主要使用,另一个做每日/每周灾备硬盘。

再买一个容量大概256G的固态u盘, 做硬盘里最重要的数据的备份。

如果还想更方便点,组个NAS,拉个好宽带,写好脚本定时增量自动同步。

当然,要看你自己有没有这个想法来利用自己的数据了。



香农定理 Shannon Theory

信源编码定理表明(在极限情况下,随着独立同分布随机变量数据流的长度趋于无穷)不可能把数据压缩得码率(每个符号的比特的平均数)比信源的香农熵还小,不满足的几乎可以肯定,信息将丢失。但是有可能使码率任意接近香农熵,且损失的概率极小。码符号的信源编码定理把码字的最小可能期望长度看作输入字(看作随机变量)的熵和目标编码表的大小的一个函数,给出了此函数的上界和下界。

你这个问题,科学家在70年前就已经解决了。

所以其实写代码给demo没什么意思,实际上界下界需要看数据序列的熵。

鉴于每放一个公式图片和理论解析,知乎阅读量跟点赞量就会大大下降。关于这个定理的具体内容,就不展开了,可以自己搜索一下。

能否把1GB的数据压缩到1MB甚至更小的体积?

题主想问的是视频流这类的数据,想要的是通解。

另一个高赞回答提到的内容和算法,其实只是一个特殊情况的解。

这种无损压缩算法叫 行程长度压缩。

对大量重复信号的序列,才会用这个算法。

比如 aaaabbbcccc ,变成 4a3b4c ,看起来是压缩更小了。

但如果是 abcdabcabcd,变成 1a1b1c1d1a1b1c1a1b1c1d,反而压缩的更大了。

大量重复信号还可以用差分编码压缩

比如说 一串数字 444444666666999999

记录其差分变化

得 4000002000000300000

还可以再套一层行程长度压缩

得 145012501350

喏 压缩就是这么回事

实际计算机里存储是二进制的,更常见的是霍夫曼编码和LZW,还有利用频域转化编码的傅里叶变换(DFT),离散余弦变换(DCT),小波变换等等,有兴趣可以自己查阅。

压缩的本质是用运算时间换取存储空间

设一个文件的存储空间是 x

压缩算法就是一个算子 f

使其得到压缩结果 y=f(x)

只要f可逆,有y就能反算出x。

好处是得到了你想要的更小的y,

坏处是你需要做 f 压缩的正运算和 解压的逆运算。

与之相反的是缓存

用存储空间换运算时间。

把运算结果直接记下来存起来,需要用的时候直接读取结果而不进行运算。

展开来讲这个话题可以讲太多内容了

如果你对这类东西特别有兴趣,考个好的本科院校,考进计算机学院,认真学 数据结构,算法,多媒体图像数据 这三门课,你会发现很有意思的。


有兴趣可以来圈子里提更多更好玩的问题。


user avatar   daixincheng 网友的相关建议: 
      

下面我现场表演一个将1TB数据压缩至几个字节的示例。

这个方法的加解压速度非常快。

而且算法能使用人类语言执行,易读性极强。

演示开始:

1TB全0。


user avatar   zhu-wang-xiao-miao-o 网友的相关建议: 
      

先上结论,1GB数据可以压缩至1MB。

是否可行取决于两个条件:

1.你要压缩的数据是什么?

2.你所使用的压缩算法

假设我们只存储由可打印的ASCII字符组成的纯文本。我们将在知乎上设计我们自己的压缩算法,我们可以叫它ZH-zip。

ZH-zip算法将按照如下方式工作:

1) 指定一个字符

2) 此字符重复的次数指定为整数

3) 下划线(_)指定某字符串出现的次数

4)没有长度的下划线表示字符只使用一次。

5)文件末尾不需要下划线。

例如,"hello"压缩如下:

       原文本:   Hello. 压缩后: H_e_l2_o.     

很明显这谈不上压缩,但是为了讲解起来方便点,举了上面的例子。

尝试压缩一些随机的字符串:

       原文本:   asdddffgggghhhhhjjjjjjkk 压缩后:   a_s_d3_f2_g4_h5_j6_k2     

可以看到我们刚刚设置的算法将该文本的长度减少了3个字符。

对于下面这个字符串而言,我们直接将其缩减了一半:

       源文本:   AAAAABBBBBBABBBBBAAAAAAAABBBBBBB 压缩后:   A5_B6_A_B5_A8_B7     

32字节被压缩为了16字节。

现在如果你有一个1GB的“A”,即使用我们上述粗制滥造的压缩算法,你也可以将其压缩到11字节

       Compressed: A1000000000     

只要重复的字符串很长,我们的压缩率就会很高。

这能够实现吗?

很显然这取决于你所需要压缩的数据。

假设您是以无损格式存储游戏整个地图的屏幕截图。 大部分屏幕截图都是由图块组成的。 数十亿个相同的草砖一遍又一遍地重复,而数百万个相同的树也重复了。(类似红白机的采蘑菇和魂斗罗)

在这种情况下你的压缩效率将会变得很高。

1GB数据被压缩为1MB当然是可能的事情啦!


user avatar   li-mu-gen-19 网友的相关建议: 
      

为什么明明吸毒了,却辟谣称未吸毒

可以把这句话的“吸毒了”,改成

嫖娼了

作弊了

抄袭了

学术不端了

资产转移了

性贿赂了

出轨了




  

相关话题

  能否把1GB的数据压缩到1MB甚至更小的体积? 
  把文件进行压缩是否本身就是一种加密? 
  为什么h264/h265的帧内压缩不直接使用现成的图片压缩技术? 
  怎么把腾讯视频下载的视频转换成MP4格式? 
  如何评价全新的图片格式BPG,它会在将来彻底取代JPG吗? 
  FLV怎么转变为MP4? 
  高压缩文件是如何实现的? 
  怎么把图片压缩成pdf啊? 
  怎么把腾讯视频下载的视频转换成MP4格式? 
  为什么两种压缩文件格式 RAR 比 ZIP 用得多? 

前一个讨论
如何评价英特尔虎湖(Tiger Lake)十一代酷睿核心显卡运行战地5平均30帧?
下一个讨论
如何理解王兴说「谷歌所谓 20% 自由时间是狠毒的」?





© 2024-12-23 - tinynew.org. All Rights Reserved.
© 2024-12-23 - tinynew.org. 保留所有权利