关于压缩:解压原来如此简单方法这样做

想要疾速简便的解压,肯定动手Bandizip Archiver 激活版,十分业余弱小的一款解压软件,反对的格局:7Z、ACE、AES、ALZ、ARJ、BH、BIN、BZ、BZ2、CAB、Compound(MSI)、EGG、GZ、IMG、ISO、ISZ、LHA、LZ、LZH、LZMA、PMA、RAR、 RAR5、SFX(EXE)、TAR、TBZ、TBZ2、TGZ、TLZ、TXZ、UDF、WIM、XPI、XZ、Z、ZIP、ZIPX、ZPAQ、ZST 轻松查看存档的文件列表 仅提取选定的文件。还反对拖放 ZIP 和 RAR 格局存档评论的可用性 一步提取TGZ/TBZ格局

March 3, 2023 · 1 min · jiezi

关于压缩:解压缩工具RAR-Extractor-Max-Unzip中文

mac上用什么软件解压缩好呢?如何将文件压缩的又快又小?RAR Extractor Max - Unzip中文激活版就是很好的一款帮手,业余解压缩神器,反对简直所有的压缩格局,比方RAR, ZIP, 7z, tbz, sti, tar, xar等等,用起来十分的方 • 解压缩、解压缩加密档案。 • 预览并关上从 Microsoft Outlook 发送的 winmAIl.dat 文件 • 轻松查看档案的文件列表。 • 提取前存档中的Quicklook 文件。 • 勾销存档和解压缩存档中选定的单个文件或文件夹。 • 将此APP设置为默认存档后,间接双击显示或解压。RAR Extractor Max - Unzip破解版地址:

October 9, 2022 · 1 min · jiezi

关于压缩:Mac电脑必备压缩神器Keka

Keka是一款弱小的压缩解压工具,只需将Keka增加到Dock栏中,而后将文件和文件夹拖放到 Dock栏 上的 Keka 图标即可疾速的创立压缩文件。Keka 反对分卷压缩,能够创立以下格局的压缩文件:7Z ZIP TAR GZIP BZIP2 XZ LZIP DMG ISO,并反对解压这些格局:7Z ZIP ZIPX RAR TAR GZIP BZIP2 XZ LZIP DMG ISO LZMA EXE CAB WIM PAX JAR WAR IPA APK APPX XPI CPGZ CPIO。!!! 软件下载:https://www.macz.com/mac/327....

July 12, 2022 · 1 min · jiezi

关于压缩:一个小巧跨平台文件流压缩解压库CrossLZ

CrossLZhttps://github.com/jcwangxp/CrossLZ CrossLZ is a tiny cross-platform fast stream compression library. When should you use CrossLZ: When you need a cross-platform compression stream library.When you need standard glibc file stream equivalent APIs.When you need a tiny extensive compression stream framework.When you need a small compression library to build into program.CatalogueFeatures and HighlightsBackgroundAPIsNew Compressorclz-cli toolCompressed File FormatExampleBuild and TestRelated ProjectsFeatures and HighlightsSupport many platforms: Windows, Linux, Unix, MacOS.Support similar standard glibc TEXT and Binary file stream APIs.Stream APIs can support either standard glibc FILE pointer or clz_FILE pointer.clz_fopen can open either compressed or regular file.Stream APIs can append or overwrite existing compressed or regular file.A common API based on CrossLZ can create or read regular/compressed file with different option.Support default LZ77(data-shrinker) compressor which is very fast and very tiny.Support LZ4 compressor which is extremely fast.Support registering new compressors.clz-cli tool can compress/decompress file and support pipe as input or output.Pure C MIT license source code, no 3rd library dependency(except LZ4 or new compressors).Very small only about 900 LOC.BackgroundI need a tiny and fast cross-platform compression library to do backup/restore work. lz4 is the first option, which is extremely fast, however I think it's too big and the stream APIs are not easy to use. Then I found a tiny and fast data-shrinker algorithm. I referred lz4 frame/block format and created the standard glibc stream equivalent APIs and these APIs can either work on regular file or compressed file. Then the backup/restore work will be very easy to just write one backup code and can generate either compressed or regular file, and this file can be sent to other device by network also. When do recovery, the input file can be either compressed or regular file, and you also only need to write one recovery code, that's all, very convenient to use. ...

March 11, 2022 · 15 min · jiezi

关于压缩:JAVA-解压rar文件

场景:解压rar文件语言:JAVA 应用依赖如下 <!-- https://mvnrepository.com/artifact/com.github.junrar/junrar --><dependency> <groupId>com.github.junrar</groupId> <artifactId>junrar</artifactId> <version>7.4.1</version></dependency>官网文档地址:https://github.com/junrar/junrar 示例:解压一个rar文件到目录 import cn.hutool.core.io.FileUtil;import cn.hutool.core.util.IdUtil;import com.github.junrar.Junrar;import com.github.junrar.exception.RarException;import org.junit.Test;import java.io.File;import java.io.IOException;public class ZipTest { @Test public void unRar() throws IOException, RarException { // 创立一个目录 File dir = FileUtil.mkdir("/Users/jinchengyu/Desktop/" + IdUtil.fastSimpleUUID()); // 解压rar文件到这个目录 Junrar.extract("/Users/jinchengyu/Desktop/ZXZT.rar", dir.getPath()); }}

March 9, 2022 · 1 min · jiezi

关于压缩:多维分析后台实践-3维度排序压缩

【摘要】 用实例、分步骤,具体解说多维分析(OLAP)的实现。点击理解多维分析后盾实际 3:维度排序压缩 实际指标本期指标,是在实现数据类型转化根底上,实现维度排序压缩,进一步晋升计算速度。 实际的步骤: 1、 筹备根底宽表:批改上期的代码,实现维度排序压缩存成新组表。 2、 拜访根底宽表:上期代码不用批改,间接利用于新组表。 3、 新增数据追加:每日新增业务数据追加,每月从新排序重整。要尽可能不影响拜访根底宽表的性能,同时减小每日新增数据所须要的工夫。 本期样例宽表不变,仍然为 customer 表。从 Oracle 数据库中取出宽表数据的 SQL 语句是 select * from customer。执行后果如下图: 假如当天日期是 2021-01-12,则取出当日新增数据的 SQL 是: select * from customer where begin_date=to_date('2021-01-12','yyyy-mm-dd') 多维分析计算的指标也不变,用上面 Oracle 的 SQL 语句示意: select department_id,job_id,to_char(begin_date,'yyyymm') begin_month ,sum(balance) sum,count(customer_id) count from customer where department_id in (10,20,50,60,70,80) and job_id in ('AD_VP','FI_MGR','AC_MGR','SA_MAN','SA_REP') and begin_date>=to_date('2002-01-01','yyyy-mm-dd') and begin_date<=to_date('2020-12-31','yyyy-mm-dd') and flag1='1' and flag8='1' group by department_id,job_id,to_char(begin_date,'yyyymm') 筹备宽表维度排序压缩:有序列存。列存是指列式存储,集算器新建组表时,默认列存。 有序是指字段值物理有序存储,也就是用维度字段排序后存入组表。用于排序的维度字段程序十分要害,要将反复度高的维度排在后面。 本例的维度包含:department_id,job_num,employee_id,begin_date,customer_id。其中,部门编号 department_id 总数起码(事实表中只呈现 11 个部门),所以反复度最高。其余字段中,job_num,employee_id,begin_date,customer_id 反复度顺次升高。 ...

January 22, 2021 · 1 min · jiezi

关于压缩:图片压缩神器过滤重复压缩直接替换源文件的-tinypng-压缩脚本

「过滤反复压缩」「替换源文件」「静默压缩,不生成冗余文件」我的项目特点【过滤反复压缩】 自动记录已被压缩过的图片,跳过压缩,加快进度。记录图片压缩后的 md5 值,再次运行压缩脚本时,跳过压缩。通过 md5 值比拟文件变更,即便「文件迁徙」也能主动过滤。通过 md5 值比拟文件变更,即便「应用同名文件替换」也能自动识别,并压缩,没有漏网之鱼。【替换源文件】 压缩胜利,间接替换源文件,不生成冗余文件,不须要复制粘贴,挪动图片。静默压缩,对我的项目无感知,无任何影响。【主动切换 api key】 tinypng 申请的 api key 每月只有 500 次收费压缩额度。可设置多个 api key,当某 key 超过应用次数时,主动切换下一个 key 进行压缩。【压缩报告】 记录每个图片的压缩数据,并生成汇总信息。【压缩平安边界】 压缩安全线,当压缩比例低于该百分比值时,放弃源文件,防止过分压缩,伤害图片品质。【源码携带具体备注,自带测试图片】 升高源码浏览门槛,升高测试门槛,减低应用门槛。举荐浏览源码,突破恐怖,便于定制个性化需要。参数介绍参数名值类型是否必填参数作用默认值推荐值apiKeyListArray必填tiny png 的 api key 数组,当其中一个不可用或超过应用次数时,主动切换下一个 key 调用无无reportFilePathNumber非必填压缩报告文件门路,记录图片的压缩比例,生产压缩报告无__dirname + '/tinypngReport.json'md5RecordFilePathNumber非必填压缩后图片 md5 记录文件,如果待压缩图片的 md5 值存在于该文件,则跳过压缩,解决「反复压缩」问题无__dirname + '/tinypngMd5Record.json'minCompressPercentLimitNumber非必填压缩安全线,当压缩比例低于该百分比时,放弃源文件,防止图片过分压缩,伤害显示品质010示例运行步骤第一步:npm install第二步:gulp测试资源test-img:图片压缩测试目录test-img-origin:测试图片备份目录,用于复原测试运行成果 压缩报告 md5 记录 特别感谢感激 Gaurav Jassal,本我的项目改编自他的 gulp-tinypng

September 4, 2020 · 1 min · jiezi

关于压缩:前端面试每日-31-第481天

明天的知识点 (2020.08.09) —— 第481天 (我也要出题)[html] button标签的type默认值是什么呢?[css] position的relative和absolute别离是绝对谁进行定位的?[js] 你有用过哪些模板引擎?你感觉哪个好用?为什么?[软技能] 个别状况下,大图片须要压缩到什么水平呢?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

August 9, 2020 · 1 min · jiezi

解密七牛云锐智转码技术打造低成本超高清的解决方案

互联网的迅速发展,提高了用户获取多样化信息的能力,根据《 2019 中国网络视听发展研究报告》显示:截至 2018 年底,我国网络视频用户规模达 7.25 亿,占总体网民的 87.5% 。视频已成为触达用户的主流媒介,网络视频行业的壮大已成为必然。如何在最小的带宽消耗下,最大幅度提升用户观看体验,成为了视频应用商首要考虑的问题。 七牛云深耕互联网行业 8 年,针对网络视频行业推出了锐智高清转码服务,融合感知编码、深度学习、图像处理、画质增强等技术,为点播、直播提供更智能的转码服务,也可以为存量视频做二次瘦身。 在体验方面,能够在低带宽条件下为用户提供高质量的视觉效果,画面更细腻、更美观。在成本方面,可以节省超过 40% 的视频码率,极大降低客户的传输带宽和视频存储成本。关键技术解密???? 智能场景分类不同场景可以适配更佳的算法提升压缩和画质效果。针对视频场景和复杂度进行两层分类,场景上包含:影视、教育、交通、体育、秀场等 10 多个类型;在部分场景上,会进一步做复杂度的分级。通过深度学习大量训练,目前CNN网络模型的准确度达到 95% 以上。 场景分类为自适应算法策略奠定基础,对于不同场景,适配的算法类别包括: 编码压缩算法和工具的组合前处理算法类别和参数ROI 感兴趣区域的算法客观质量评价工具 VMAF 的较准Per-Title 参数的选取锐智高清的智能自适应目标是在不同场景下匹配最优的算法,追求最佳的收益效果。以在线教育场景为例,屏幕录制为视频主要内容,针对屏幕内容采用特定算法可取得有效的针对性提升;而在秀场场景上,算法会更倾向于人脸和细节上的优化;再到体育场景,运动目标检测和去运动模糊是主要关注点。锐智高清智能自适应场景视频处理 Per-Title编码技术根据视频内容自适应码率以及自适应分辨率。在 Per-Title 技术出现之前,视频服务提供商通常会使用一个事先确定好的通用的编码配置来处理几乎所有的视频内容。一方面存在浪费,另一方面也不能始终给用户最佳体验。相比于传统的编码方案,Per-Title 编码技术更加注重不同类型视频之间的区分度,为每一个视频或视频片段找出满足清晰度和主观敏感度要求的最低码率点,以达到节省带宽的目的。除了根据内容自适应码率,Per-Title 技术还包括自适应分辨率。图片来源:Netflix 如图所示,对于同一视频源,采用三个分辨率,以及不同的码率编码。在各个分辨率下,编码质量随着码率的增加而单调上升。当码率达到一定阈值后,曲线开始变得平缓,这时需要通过提升分辨率才能进一步提升质量。 通过大量实战,锐智高清转码建立起的智能码控决策模型,对不同类型、相同类型不同片源、相同片源不同片段,应用完全不一样的编码参数,并且可以按帧级智能调优。锐智高清使用时可以让用户设置一个上限码率,码控模型将bits有效分配到最有价值的地方,在保障画质下尽可能输出最低码率。锐智高清秀场场景,画质相当节省码率66% AI视频前处理AI 视频前处理是提升画质的关键所在。由多个算法模块组成,每个模块负责某种画质增强的方向,包括:去编码脏效应、去噪、去毛刺、锐化、对比度增强、饱和度增强、去模糊等,各模块自适应调整强度,协同作用。 AI 视频前处理除了提升主观画质以外,其作用效果并非完全与视频编码解耦。比如在增强人眼易关注纹理的同时,弱化人眼不易察觉的信息,以期达到节省编码码率的目的。值得一提的是,所有的前处理 AI 算法,我们经过大量的调优打磨来平衡计算资源的消耗。锐智高清-AI前处理对画质大幅提升 ROI与码字分配ROI 感兴趣区域识别,以及更合理的码字分配,重点考虑了以下几个方面: 人脸人脸大概率是主观敏感区域。准确定位人脸,做针对性地画质调优以及编码参数调优。智能转码系统支持标准版和超低复杂度版本人脸检测,其中超低复杂度版本处理 1080P 视频在 2ms 每帧以内。 人眼聚焦区域、前景重点区域智能转码系统支持标准版和超低复杂度版人眼聚焦区域检测。标准版聚焦区域检测:采用眼动仪训练样本,有效定位人眼聚集区域。超低复杂度版聚焦区域检测:1080P 视频单核运算时间在 1ms 每帧以内,复杂度基本忽略不计。 各个块的主观敏感度X264 默认的自适应量化(AQ),仅仅依据方差大小作为评判依据,对方差大的块施以更大的量化因子。方差大小的鲁棒性不足,甚至都不能很好地判断平滑程度。如图示例的一维信号,左图的方差比右图更大,事实上左图是比较平滑的。图片来源:Fan Zhang, etc. Limitation and Challenges of Image Quality Measurement. SPIE 2010 以 RaceHorses 为例,第一行宏块,正好绿色草丛背景块的方差比较小,而涵盖了帽子、人脸、人眼的宏块方差比较大,导致主观敏感的人脸/人眼被施加了较大的 delta QP。智能转码系统区分了易被人眼关注的规则纹理,加以保护,在其他编码条件相同的条件下,取得明显改善。 ...

July 4, 2019 · 1 min · jiezi

Go使用压缩文件优化io-一

原文连接:https://blog.thinkeridea.com/... 最近遇到一个日志备份 io 过高的问题,业务日志每十分钟备份一次,本来是用 Python 写一个根据规则扫描备份日志问题不大,但是随着业务越来越多,单机上的日志文件越来越大,文件数量也越来越多,导致每每备份的瞬间 io 阻塞严重, CPU 和 load 异常的高,好在备份速度很快,对业务影响不是很大,这个问题会随着业务增长,越来越明显,这段时间抽空对备份方式做了优化,效果十分显著,整理篇文章记录一下。 背景说明服务器配置:4 核 8G; 磁盘:500G每十分钟需要上传:18 个文件,高峰时期约 10 G 左右 业务日志为了保证可靠性,会先写入磁盘文件,每10分钟切分日志文件,然后在下十分钟第一分时备份日志到 OSS,数据分析服务会从在备份完成后拉取日志进行分析,日志备份需要高效快速,在最短的时间内备份完,一般备份均能在几十秒内完成。 备份的速度和效率并不是问题,足够的快,但是在备份时 io 阻塞严重导致的 CPU 和 load 异常,成为业务服务的瓶颈,在高峰期业务服务仅消耗一半的系统资源,但是备份时 CPU 经常 100%,且 iowait 可以达到 70 多,空闲资源非常少,这样随着业务扩展,日志备份虽然时间很短,却成为了系统的瓶颈。 后文中会详细描述优化前后的方案,并用 go 编写测试,使用一台 2 核4G的服务器进行测试,测试数据集大小为: 文件数:336原始文件:96G压缩文件:24G压缩方案:lzoGoroutine 数量:4优化前优化前日志备份流程: 根据备份规则扫描需要备份的文件使用 lzop 命令压缩日志上传压缩后的日志到 OSS下面是代码实现,这里不再包含备份文件规则,仅演示压缩上传逻辑部分,程序接受文件列表,并对文件列表压缩上传至 OSS 中。 .../pkg/aliyun_oss 是我自己封装的基于阿里云 OSS 操作的包,这个路径是错误的,仅做演示,想运行下面的代码,OSS 交互这部分需要自己实现。 package mainimport ( "bytes" "fmt" "os" "os/exec" "path/filepath" "sync" "time" ".../pkg/aliyun_oss")func main() { var oss *aliyun_oss.AliyunOSS files := os.Args[1:] if len(files) < 1 { fmt.Println("请输入要上传的文件") os.Exit(1) } fmt.Printf("待备份文件数量:%d\n", len(files)) startTime := time.Now() defer func(startTime time.Time) { fmt.Printf("共耗时:%s\n", time.Now().Sub(startTime).String()) }(startTime) var wg sync.WaitGroup n := 4 c := make(chan string) // 压缩日志 wg.Add(n) for i := 0; i < n; i++ { go func() { defer wg.Done() for file := range c { cmd := exec.Command("lzop", file) cmd.Stderr = &bytes.Buffer{} err := cmd.Run() if err != nil { panic(cmd.Stderr.(*bytes.Buffer).String()) } } }() } for _, file := range files { c <- file } close(c) wg.Wait() fmt.Printf("压缩耗时:%s\n", time.Now().Sub(startTime).String()) // 上传压缩日志 startTime = time.Now() c = make(chan string) wg.Add(n) for i := 0; i < n; i++ { go func() { defer wg.Done() for file := range c { name := filepath.Base(file) err := oss.PutObjectFromFile("tmp/"+name+".lzo", file+".lzo") if err != nil { panic(err) } } }() } for _, file := range files { c <- file } close(c) wg.Wait() fmt.Printf("上传耗时:%s\n", time.Now().Sub(startTime).String())}程序运行时输出: ...

June 30, 2019 · 6 min · jiezi

PHP-实现压缩解压操作

在php中,有时我们需要使用到压缩文件操作,压缩文件可以节省磁盘空间;且压缩文件更小,便于网络传输,效率高,下面我们就来了解php的压缩解压相关操作 在PHP中有一个ZipArchive类,专门用于文件的压缩解压相关操作 在ZipArchive类中主要使用到了如下方法: 1:open(打开一个压缩包文件) $zip = new \ZipArchive;$zip->open('test_new.zip', \ZipArchive::CREATE)第一个参数:要打开的压缩包文件 第二个参数: ZIPARCHIVE::OVERWRITE 总是创建一个新的文件,如果指定的zip文件存在,则会覆盖掉 ZIPARCHIVE::CREATE 如果指定的zip文件不存在,则新建一个 ZIPARCHIVE::EXCL 如果指定的zip文件存在,则会报错 ZIPARCHIVE::CHECKCONS 对指定的zip执行其他一致性测试 2:addFile(将指定文件添加到压缩包中) //将test.txt文件添加到压缩包中$zip->addFile('test.txt'); //第二个参数可对文件进行重命名3:addEmptyDir (将指定空目录添加到压缩包中) //将一个空的目录添加到zip中 $zip->addEmptyDir ('newdir');4:addFromString(将指定内容的文件添加到压缩包) // 将有指定内容的new.txt文件添加到zip文件中$zip->addFromString('new.txt', '要添加到new.txt文件中的文本');5:extractTO(将压缩包解压到指定目录) $zip->extractTo('test');6:getNameIndex(根据索引返回文件名称) $zip->getNameIndex(0);//返回压缩包中索引为0的文件名称7:getStream(根据压缩内的文件名称,获取该文件的文本流) $zip->getStream('hello.txt');8:renameIndex(根据压缩文件内的索引(从0开始)修改压缩文件内的文件名) /把压缩文件内第一个文件修改成newname.txt $zip->renameIndex(0,'newname.txt');9:renameName(根据压缩文件内的文件名,修改压缩文件内的文件名) //把压缩文件内的word.txt修改成newword.txt $zip->renameName('word.txt','newword.txt');10:deleteIndex (根据压缩文件内的索引删除压缩文件内的文件) /把压缩文件内第一个文件删除 $zip->deleteIndex (0);11:deleteName(根据压缩文件内的文件名删除文件) //把压缩文件内的word.txt删除$zip->deleteName('word.txt');上面就是ZipArchive的一些常用方法,下面来一些简单示例 一:创建一个压缩包 $zip = new \ZipArchive;if ($zip->open('test_new.zip', \ZipArchive::CREATE) === true){ // 将指定文件添加到zip中 $zip->addFile('test.txt'); // test.txt文件添加到zip并将其重命名为newfile.txt $zip->addFile('test.txt', 'newfile.txt'); // 将test.txt文件添加到zip文件中的test文件夹内 $zip->addFile('test.txt', 'test/newfile.txt'); //将一个空的目录添加到zip中 $zip->addEmptyDir ('test'); // 将有指定内容的new.txt文件添加到zip文件中 $zip->addFromString('new.txt', '要添加到new.txt文件中的文本'); // 将有指定内容的new.txt添加到zip文件中的test文件夹 $zip->addFromString('test/new.txt', '要添加到new.txt文件中的文本'); //将images目录下所有文件添加到zip中 if ($handle = opendir('images')){ // 添加目录中的所有文件 while (false !== ($entry = readdir($handle))){ if ($entry != "." && $entry != ".." && !is_dir('images/' . $entry)){ $zip->addFile('images/' . $entry); } } closedir($handle); } // 关闭zip文件 $zip->close();}二:获取压缩包的文件信息并解压指定压缩包 ...

June 13, 2019 · 1 min · jiezi

数据编码与压缩

内存数据结构这个就太多了。。略 IO:json/xml(无类型,unicode支持不好等),二进制编码JSON演化mmessagePack不流行,因为需要在编码数据中包含对象名称.只是删除空白和标点的感觉thrift BinaryProtocal 字段名替换为序号 { "userName": "Martin", "favoriteNumber": 1337, "interests": ["daydreaming", "hacking"]} pb(thrift的compactProtocal和这个一样) field和type在单个字节。数据的优化数据最高位标识是否还有后续,这个1337有错误,是下面的 Avro 数据变更兼容:thrift和protocal可以换换名字。但是不能换编号,可以增加编号,旧的编号删了也不能再用,后加的向前兼容不能设为必选。模式和数据编码分别传送,一个传一个模式,大批数据,无编号,读者模式与作者模式匹配,读者解析作者模式 只能添加或删除有默认值的字段以上数字的转变全是基于VLQ可变长二进制数字编码的变体。最低位加0表示整数,1表示负数,然后7位一个分割。从最后开始,每个后面有第一位是1,否则是0. 压缩压缩算法对比 ![clipboard.png](/img/bVbr5Th)![clipboard.png](/img/bVbr5TX)https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZOhttps://www.percona.com/blog/2016/04/13/evaluating-database-compression-methods-update/snappy/LZ77/LZSSDC动态词典编码:用它在词典中的位置号码代替。静态需要实现知道词典,讲下动态的前向缓冲区(数据流将要处理的所有字符)的开始字符串与滑动窗口中的字符串进行最长匹配,无移动窗口,若找到<匹配字符串在滑动窗口的位置,长度,移除前置缓冲区中匹配部分移除后续第一个字符>,LZSS增加匹配长读限制如何快速最长匹配字符串:简单的将窗口中所有字符顺序组合存入hash,也可以存固定长度,比如2,匹配多个后再继续向后比较这多个。snappy 将整个数据切割为32k一个大小的块,块只见那无关联,2个字节就可表示匹配字符串的相对位置,匹配长度至少为4,hash字符串长度也固定为4.输出字符串的压缩形式为 编码方案,匹配字符串起始位置差值,匹配字符串长度 EC编码:N个数据块和校验,可以任意丢k个相互恢复因为我们都是多副本,N个Data块,生成K个Parity块,N+K中可任意丢K个可靠性相同时比多副本冗余度低只有一份数据可读,修复较复杂提高可靠性:增加K,增加N和K,提高修复速度https://blog.csdn.net/shelldo...

April 30, 2019 · 1 min · jiezi

通过 Node 批量下载文件到本地(多文件)

最近在做一个文件下载的功能,这里把做的过程中用的技术和坑简要总结下。上篇文章《通过 JavaScript 下载文件到本地(单文件)》说了下如何下载单文件,这篇主要说下如何做多文件的批量下载多文件分别处理如果文件数量可控,对于下载出来的文件格式无要求,可以用最简单的办法,直接遍历文件,分别给每个下载链接创建一个单文件的download或者iframe下载链接。zip包批量下载虽然说可以遍历所有文件,然后去批量下载单个文件,但是这种体验毕竟不太好,最常见的做法是把批量的文件下载并打包到zip中。所以首先的一个实现思路是:在代理服务里,先去遍历所有的文件去请求文件数据,然后压缩到zip包中,然后再把zip包返回给客户端。这么做对于下载量数据比较小时ok,但是如果批量文件特别多特别大时,用户要等后台把所有的数据都请求到并且都打包都压缩包里,前端才能有反馈,这个时间可能会耗时很长,用户体验可能很差。在同事的前期调研时,有说这里可以做一个流式的边压缩边下载的能力,大致的思路是,chunk回包,加流式压缩。……let fileCounter = 0;const zippedFilename = encodeURIComponent(downloadData.name);const list = downloadData.list || [];const header = { ‘Content-Type’: ‘application/x-zip’, ‘Pragma’: ‘public’, ‘Expires’: ‘0’, ‘Cache-Control’: ‘private, must-revalidate, post-check=0, pre-check=0’, ‘Content-disposition’: ‘attachment; filename="’ + zippedFilename + ‘"’, ‘Transfer-Encoding’: ‘chunked’, ‘Content-Transfer-Encoding’: ‘binary’};res.writeHead(200, header);archive.store = true;archive.pipe(res);list.map(item => { fileCounter++; let inStream = request.get(item.downLoadUrl); let name = item.fileName; let length = 0; inStream.on(‘response’, function(awsData) { archive.append(inStream, { name: name }); }).on(‘data’, function(data) { length += data.length; }).on(’error’, function(e) { console.error(name + ‘-error’, e); }).on(’end’, function(endData) { fileCounter–; if (fileCounter < 1) { archive.finalize(); } });});archive.on(’error’, function(err) { throw err;});archive.on(‘finish’, function(err) { return res.end();});……当然中间还有些细节需要处理:比如中文文件名的问题,是否需要下载文件总大小做限制,是否会出现文件不存在等等情况。 ...

March 15, 2019 · 1 min · jiezi

开发函数计算的正确姿势——使用 brotli 压缩大文件

大文件问题函数计算对上传的 zip 代码包尺寸限制为 50M。某些场景中代码包中会超过这一限制,比如二进制 serverless-chrome 经过一番裁剪以后 ZIP 压缩包的体积为 43.4M,类似的还有 liboffice ,此外常见的还有机器学习训练的模型文件。目前解决大文件问题有三种方法采用更高压缩比的算法,比如本文介绍的 brotli 算法采用 OSS 运行时下载采用 NAS 文件共享简单的比较一下这三种方法的优劣方法优点缺点高密度压缩发布简单,启动最快上传代码包较慢;要写解压代码;大小受限制不超过 50 MOSS下载解压后文件不超过 512 M需要预先上传至 OSS;要写下载和解压代码,大概 50M/s 的下载速度NAS文件大小没有限制,无需压缩需要预先上传至 NAS;VPC 环境有冷启动时延(~5s)正常情况下如果代码包能控制在 50M 以下启动较快。而且工程上也比较简单,数据和代码放在一起,不需要额外的写脚本去同步更新 OSS 或者 NAS。压缩算法Brotli 是 Google 工程师开发的开源压缩算法,目前已经被新版的主流浏览器支持,作为 HTTP 传输的压缩算法。下面是在网上找到的关于 Brotli 和其他常见压缩算法对比基准测试。从上面三幅图我们可以看出:相比于 gzip、xz 和 bz2,brotli 有最高的压缩比,接近于 gzip 的解压速度,以及最慢的压缩速度。然而在我们的场景对于压缩慢这一缺点不敏感,压缩任务只要在开发准备物料的阶段执行一次就好了。制作压缩文件下面我先介绍一下如何制作压缩文件。下面的代码和用例都来自于项目 packed-selenium-java-example 。安装 brotli 命令Mac 用户brew install brotliWindows 用户可以去这个界面下载,https://github.com/google/brotli/releases打包并压缩打包前两个文件大小分别为 7.5M 和 97M╭─ ~/D/test1[◷ 18:15:21]╰─ lltotal 213840-rwxr-xr-x 1 vangie staff 7.5M 3 5 11:13 chromedriver-rwxr-xr-x 1 vangie staff 97M 1 25 2018 headless-chromium使用 GZip 打包并压缩,大小为 44 M。╭─ ~/D/test1[◷ 18:15:33]╰─ tar -czvf chromedriver.tar chromedriver headless-chromiuma chromedrivera headless-chromium╭─ ~/D/test1[◷ 18:16:41]╰─ lltotal 306216-rwxr-xr-x 1 vangie staff 7.5M 3 5 11:13 chromedriver-rw-r–r– 1 vangie staff 44M 3 6 18:16 chromedriver.tar-rwxr-xr-x 1 vangie staff 97M 1 25 2018 headless-chromiumtar 去掉 z 选项再打包一遍,大小为 104M╭─ ~/D/test1[◷ 18:16:42]╰─ tar -cvf chromedriver.tar chromedriver headless-chromiuma chromedrivera headless-chromium╭─ ~/D/test1[◷ 18:17:06]╰─ lltotal 443232-rwxr-xr-x 1 vangie staff 7.5M 3 5 11:13 chromedriver-rw-r–r– 1 vangie staff 104M 3 6 18:17 chromedriver.tar-rwxr-xr-x 1 vangie staff 97M 1 25 2018 headless-chromium压缩后的大小为 33M,相比 Gzip 的 44M 小了不少。耗时也非常的感人 6 分 18 秒,Gzip 只要 5 秒。╭─ ~/D/test1[◷ 18:17:08]╰─ time brotli -q 11 -j -f chromedriver.tarbrotli -q 11 -j -f chromedriver.tar 375.39s user 1.66s system 99% cpu 6:18.21 total╭─ ~/D/test1[◷ 18:24:23]╰─ lltotal 281552-rwxr-xr-x 1 vangie staff 7.5M 3 5 11:13 chromedriver-rw-r–r– 1 vangie staff 33M 3 6 18:17 chromedriver.tar.br-rwxr-xr-x 1 vangie staff 97M 1 25 2018 headless-chromium运行时解压缩下面以 java maven 项目为例添加解压依赖包<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.18</version></dependency><dependency> <groupId>org.brotli</groupId> <artifactId>dec</artifactId> <version>0.1.2</version></dependency>commons-compress 是 apache 提供的解压缩工具包,对于各种压缩算法提供一致的抽象接口,其中对于 brotli 算法只支持解压,这里足够了。org.brotli:dec 包是 Google 提供的 brotli 解压算法的底层实现。实现 initialize 方法public class ChromeDemo implements FunctionInitializer { public void initialize(Context context) throws IOException { Instant start = Instant.now(); try (TarArchiveInputStream in = new TarArchiveInputStream( new BrotliCompressorInputStream( new BufferedInputStream( new FileInputStream(“chromedriver.tar.br”))))) { TarArchiveEntry entry; while ((entry = in.getNextTarEntry()) != null) { if (entry.isDirectory()) { continue; } File file = new File("/tmp/bin", entry.getName()); File parent = file.getParentFile(); if (!parent.exists()) { parent.mkdirs(); } System.out.println(“extract file to " + file.getAbsolutePath()); try (FileOutputStream out = new FileOutputStream(file)) { IOUtils.copy(in, out); } Files.setPosixFilePermissions(file.getCanonicalFile().toPath(), getPosixFilePermission(entry.getMode())); } } Instant finish = Instant.now(); long timeElapsed = Duration.between(start, finish).toMillis(); System.out.println(“Extract binary elapsed: " + timeElapsed + “ms”); }}实现 FunctionInitializer 接口的 initialize 方法。解压过程刚开始是四层嵌套流,作用分别如下:FileInputStream 读取文件BufferedInputStream 提供缓存,介绍系统调用带来的上下文切换,提示读取的速度BrotliCompressorInputStream 对字节流进行解码TarArchiveInputStream 把 tar 包里的文件逐个解出来然后 Files.setPosixFilePermissions 的作用是还原 tar 包中文件的权限。代码太长此处略去,参阅 packed-selenium-java-exampleInstant start = Instant.now();…Instant finish = Instant.now();long timeElapsed = Duration.between(start, finish).toMillis();System.out.println(“Extract binary elapsed: " + timeElapsed + “ms”);上面的代码段会打印出解压的耗时,真实执行大概在 3.7 s 左右。最后不要忘记在 template.yml 里配置上 Initializer 和 InitializationTimeout参考阅读https://www.opencpu.org/posts/brotli-benchmarks/https://github.com/vangie/packed-selenium-java-example本文作者:倚贤阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

March 8, 2019 · 2 min · jiezi