我将定期将一组基于文本的数据从网页推送到服务器,可能是JSON.
对于每次推送,没有,部分或全部数据可能已经改变.为了减少我必须通过线路发送的数据量,我希望仅在每次推送中发送变化的差异.
您知道任何预先制作的解决方案/工具/库:
动态构建JSON的差异,因为对它进行了更改(以避免存储使用JavaScript编写的oldJson和newJson以及执行每次推送的完全差异)(即,对于客户端)
在服务器端使用JSON diff修补现有的JSON块,在任何非Java或.NET ^平台上编写(需要在linux上运行,Java不是我所使用的env的选项,Mono也不是).
而且,这甚至是解决这个特殊问题的最佳方式吗?是否有更好的方法来推送大量的文本数据?
编辑:一些澄清:
可能的数据结构基本上是相当平坦的(在它是高度连接的意义上,因此任何链接将是基于ID的引用而不是实际的嵌套数据)节点的集合.节点包含树的集合,这些树的叶子包含实际的"主要"数据,例如数字,字符串和ID.大多数数据更改将在叶子中.
大多数叶子数据将非常小(原始数据或少于一段文本),但有些将非常长("丰富"文本页面).
目前我们可以严格一对一地考虑这一点,即只有一个客户端连接(读/写)任何特定的数据结构.
在复杂性方面保持服务器尽可能小是件好事 - 想法是尽可能地远离服务器.虽然HTML5仍然大部分都不受支持,但我仍然需要一个存储数据但是...
^那是你期望的随机共享主机.我说的是你的好朋友PHP,Python,PERL,Ruby,那些富勒斯.或者,可以在随机共享主机上轻松安装的东西.
这也是我一直在努力的事情.如果其他人提供比我更好的答案,我会非常感兴趣,但暂时...
首先,有http://www.xn--schler-dya.net/blog/2008/01/15/diffing_json_objects/
我个人无法让这个库工作,但你的milage可能会有所不同.
另一种方法是不尝试使用DIFF算法解决问题.它的效率非常低,并且根据问题的不同,您可能会获得更好的性能指标,只需发送整个数据,即使您最终会重复自己.主要是非常小的数据块.显然,随着您需要传输的数据变得越来越大,将会出现转折点,但如果没有某种测量,转折点就不会很明显.这里的诀窍是,你的数据越大,你的差异计算也会越长.转折点仅取决于每种方法生长速度形成的两条线的交点,这两条线的线性或更差都取决于你的差异的实现方式.在最坏的情况下,
尝试差异之前的下一步是将数据访问包装在"get","set"和"delete"方法中,以跟踪正在进行的更改.您通过网络发送的数据基本上是这些方法使用的顺序日志,您可以在每次成功传输时从客户端刷新.在服务器端,您可以将此日志应用于服务器端数据,并使用与数据访问方法类似的服务器类型.这是一种比不需要太多处理能力的差异稍微更轻的解决方案.
最后,如果你要做diff,我能想到的最有效的方法是你是否可以将数据集分解为离散的"块",每个块都有一个唯一的ID.然后当你运行差异时,差异的过程正好在"块"级别.也就是说,您所做的唯一比较是ID到ID.如果您更改了一个块,请为其添加一个新ID.你能负担得起diff算法的花费越少,运行所需的时间就越少.
或者,您可以简单地运行diff以检查特定对象是否已"更改",并在检测到更改时立即停止,并简单地将该块标记为要在其中重新发送,而不是在更改时分配新ID. entirity,用相同的ID更新服务器端的块.如果您的块有一些快速哈希算法可以用来快速建立相等性,那么这可以变得更加高效.
如果块的顺序无关紧要,或者您可以将序列存储为块本身的属性,而不是通过块的物理序列建模,那么您甚至可以通过ID键入块.然后发现差异只是列出对象A的键,然后在对象B上查找它们,然后是副Versa.这比"真正的"diff算法更容易实现,它具有O(a + b)性能(我认为)优于真实diff算法的最坏情况,如果你有可能获得我试图自己实现它,或者实现糟糕的实现.