【发布时间】:2017-03-01 03:46:24
【问题描述】:
这是问题所在 - 我想在服务器上生成二进制文件(> 1 MB 大小)的增量,并通过 HTTP 将增量发送到内存受限(RAM 不足且没有动态内存)的嵌入式设备。 Delta 是首选(而不是从服务器发送完整的二进制文件),因为通过线路传输数据涉及的成本很高。
问题在于,嵌入式设备无法解码增量并在内存中创建新文件的内容。我研究了各种二进制增量编码/解码算法,如 bsdiff、VCDiff 等,但无法找到支持流式传输的库。
也许,与其询问是否有合适的库,我是否可以采取其他方法来解决原始问题(通过网络发送最少的数据)?虽然如果有合适的增量库支持流式解码(用 C 或 C++ 编写,不使用动态内存),那肯定会有所帮助。
【问题讨论】:
-
您是否同时控制服务器和嵌入式设备上的软件?嵌入式设备是否有文件的副本开始?它保存在哪里? (如果文件大于 1MB,则不太可能将其保存在 RAM 中!)嵌入式系统需要对文件做什么?
-
是的,我控制两端的软件。是的,它确实有原始(参考)文件的副本。由于内存限制,它必须将其流式传输到文件系统上的文件中。嵌入式设备需要通过“修补”原始(参考)文件来创建新文件。
-
另外,这些增量的应用是为了降低嵌入式设备的OTA升级成本。
-
我的第一次尝试是使用一个简单的 diff 算法来解决常见的子序列问题 (en.wikipedia.org/wiki/Longest_common_subsequence_problem)。从此生成差异仍然是顺序的,如果您想流式传输差异,这是一个很好的质量。
-
如果您不需要经常访问文件(或者可以容忍适度的延迟),您可以将差异与原始文件一起存储,并在-fly 修补嵌入式设备上的文件读取 shim。 shim 将提供标准的
read( buf, len )接口,但会通过首先进入原始文件,然后通过影响文件该部分的每个差异来填充缓冲区,并适当地修改返回缓冲区。对于覆盖类型的差异,这很容易。但是,对于删除和插入,它会很复杂。
标签: c++ c embedded compression delta