Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

杰杰: patch时控制空间占用的办法? #182

Closed
sisong opened this issue Sep 21, 2019 · 11 comments
Closed

杰杰: patch时控制空间占用的办法? #182

sisong opened this issue Sep 21, 2019 · 11 comments

Comments

@sisong
Copy link
Owner

sisong commented Sep 21, 2019

by @jiejieTop
我想将它用在嵌入式设备上,实现差分升级,但是对内存资源的消耗好像有点大,一般来说很少会留出 (oldSize+newSize+diffSize)+O(1) bytes of memory 那么多的空间~ 请问博主还有其他方法吗~

@sisong
Copy link
Owner Author

sisong commented Sep 21, 2019

  • oldSize这块占用没有办法压缩,当前算法约定其可以被随机访问(当然它可以在内存或磁盘上都行);(可以考虑根据补丁中引用到的old数据保留,预先删除没有引用到的部分old数据)
  • diffSize这块占用,一个可行的办法是:不要全部下载下来,将网络上的补丁包抽象成一个hpatch_TStreamInput输入流,当其数据被实际访问到的时候,才从网上即时下载(不储存在内存里或磁盘上);
  • newSize这块占用 ,它是一个单次顺序写的输出流, 可以考虑提供一个压缩流(可以选择压缩速度快的算法或参数),这样写到内存里或磁盘上的是一个压缩数据块,清理掉old数据后再解压它;
  • 这是空间占用,可以充分利用内存+磁盘的总空间;
  • 以上都不够,那就只能考虑写新patch算法,比如实现类似 支持原地更新老数据 #36

@sisong sisong changed the title 杰杰: patch时控制磁盘空间的办法? 杰杰: patch时控制空间占用的办法? Sep 21, 2019
@jiejieTop
Copy link

@sisong 十分感谢您百忙之中的回复,我我想到了一个方法,可以节省一点内存,不知道能不能实现,方法如下:首先将旧固件压缩存放到压缩分区,然后将原本旧固件区域作为新固件的输出分区,差分升级包存放在差分升级包分区,在升级的时候讲旧固件解压到ram(运行内存)中,作为参数传入,这样子应该能减少不少磁盘的占用。
再次感谢您的回复,谢谢

@sisong
Copy link
Owner Author

sisong commented Sep 23, 2019

为什么要压缩old?先下载补丁,再直接加载old到内存,删除old; 这样更快更省磁盘

@jiejieTop
Copy link

@sisong 因为我考虑了升级失败需要回滚,所以要备份一下,采用压缩的方式备份,占用flash会小一点

@sisong
Copy link
Owner Author

sisong commented Sep 23, 2019


如果有开启checksum校验old和补丁,patch失败的几率极低,如果还是失败这时(或机器重启时)可以选择下载完整new

@jiejieTop
Copy link

@sisong 好的,非常感谢您!我后续遇到问题再来请教您,非常感谢。

@sisong sisong closed this as completed Sep 25, 2019
@catjimm1
Copy link

catjimm1 commented Jan 4, 2021

你好,我注意到您有提及“diffSize这块占用,一个可行的办法是:不要全部下载下来,将网络上的补丁包抽象成一个hpatch_TStreamInput输入流,当其数据被实际访问到的时候,才从网上即时下载(不储存在内存里或磁盘上);”,想请教一下如何实现,打个比方:我在服务器上上传了差分包,通过http连接的方式下载下来,每次请求http服务器数据,服务器发送256个字节大小的数据给我(也就是读一次http应答能拿到差分包的256个字节),那么我在打补丁的时候可以通过“ mem_as_hStreamInput(&diffStream,diff,diff+256);”这样的方式不断去顺序生成新固件吗?还是我的描述不对,思路不对,我在这个问题上困扰三天了,非常期待您的解答。

@jiejieTop
Copy link

jiejieTop commented Jan 5, 2021 via email

@catjimm1
Copy link

catjimm1 commented Jan 5, 2021

每个差分包都有控制字段的,并不是偏移就可以解决的事

---原始邮件--- 发件人: "8888github8888"<[email protected]> 发送时间: 2021年1月4日(周一) 下午5:57 收件人: "sisong/HDiffPatch"<[email protected]>; 抄送: "Mention"<[email protected]>;"杰杰"<[email protected]>; 主题: Re: [sisong/HDiffPatch] 杰杰: patch时控制空间占用的办法? (#182) 你好,我注意到您有提及“diffSize这块占用,一个可行的办法是:不要全部下载下来,将网络上的补丁包抽象成一个hpatch_TStreamInput输入流,当其数据被实际访问到的时候,才从网上即时下载(不储存在内存里或磁盘上);”,想请教一下如何实现,打个比方:我在服务器上上传了差分包,通过http连接的方式下载下来,每次请求http服务器数据,服务器发送256个字节大小的数据给我(也就是读一次http应答能拿到差分包的256个字节),那么我在打补丁的时候可以通过“ mem_as_hStreamInput(&diffStream,diff,diff+256);”这样的方式不断去顺序生成新固件吗?还是我的描述不对,思路不对,我在这个问题上困扰三天了,非常期待您的解答。 — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

感谢您的回复,正如你所说,每个差分包都有控制字段,因为我打算在嵌入式设备上打补丁,在下载差分包的时候,内存只剩20k左右的空间,甚至更小(但是一个差分包的大小在40k以上),老固件是存在与flash上(类似电脑硬盘),输出的新固件会写进flash另一个分区,差分包只能放在内存里,但是因为空间大小无法放下整个差分包。我从您的示例代码上看,似乎不能把一个差分包分块来生成新固件,不知道是不是我遗漏了什么,能否请您指教一下。

@sisong
Copy link
Owner Author

sisong commented Jan 5, 2021

"mem_as_hStreamInput(&diffStream,diff,diff+256);" “不断去顺序生成新固件吗?”

不对,patch函数只能执行一次; 你的数据不在内存,就不应该使用mem_as_hStreamInput;
patch参数要求的是一个输入流hpatch_TStreamInput,你就可以自己实现这个流接口,读取函数在每次请求数据的时候,动态的从网上下载相应的数据段;
(另外diff&patch函数的选择上可以看看create_single_compressed_diff()/patch_single_compressed_diff()这对组合是否更合适你的需求;)

@catjimm1
Copy link

catjimm1 commented Jan 5, 2021

"mem_as_hStreamInput(&diffStream,diff,diff+256);" “不断去顺序生成新固件吗?”

不对,patch函数只能执行一次; 你的数据不在内存,就不应该使用mem_as_hStreamInput;
patch参数要求的是一个输入流hpatch_TStreamInput,你就可以自己实现这个流接口,读取函数在每次请求数据的时候,动态的从网上下载相应的数据段;
(另外diff&patch函数的选择上可以看看create_single_compressed_diff()/patch_single_compressed_diff()这对组合是否更合适你的需求;)

感谢您的提示,我再研究一下您的源码。

@sisong sisong added this to the singleCompressedStream-v4.0 milestone Jun 11, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants