如何推送数据差异(可能是JSON)到服务器?

我将定期将一组基于文本的数据从网页送到服务器 ,可能是JSON。

对于每次推送,都没有,部分或全部数据可能已经改变。 为了减少我必须通过电线发送的数据量,我只想发送每次推送中变化的差异。

你知道任何预制解决方案/工具/库,它们:

  • 动态构建JSON的差异,以便对其进行更改 (以避免存储oldJson和newJson,并在每次推送时执行完全差异化)(例如,用于客户端)
  • 在服务器端使用JSON差异修补现有的JSON块 ,在任何不是Java或.NET的平台上编写(需要在Linux上运行,Java不是我所使用的env的选项,也不是Mono )。
  • 而且,这甚至是解决这个问题的最好方法吗? 有更好的方式来推动文本数据块吗?

    编辑:一些澄清:

  • 可能的数据结构基本上是相当平坦的(从高度连接的意义上说,任何链接都是基于ID的引用而不是实际的嵌套数据)节点集合。 节点包含树的集合,这些树的叶子包含实际的“主要”数据,例如数字,字符串和ID。 大部分数据变化将在叶子上。
  • 大部分叶子数据将会非常小(主要或小于一段文本),但有些将会很长(富文本页面)。
  • 目前我们可以认为这是严格的一对一的,即只有一个客户端连接(读/写)到任何特定的数据结构。
  • 在复杂性方面尽可能降低服务器的数量是件好事 - 这个想法是尽可能避免使用服务器。 虽然HTML5仍然大部分不受支持,但我仍然需要一个来存储数据,但......
  • ^这是你期望随机共享主机。 我正在谈论你的好朋友PHP,Python,PERL,Ruby,那些fullas。 或者,可以轻松安装在随机共享主机上的东西。


    这一直是我一直在努力的事情。 如果其他人提供比我更好的答案,我会敏锐地感兴趣,但暂时......

    首先,有http://www.xn--schler-dya.net/blog/2008/01/15/diffing_json_objects/

    我个人一直无法让这个库工作,但你的milage可能会有所不同。

    另一种选择是不尝试使用DIFF算法解决问题。 这是相当无效的,并且根据问题,即使您最终重复自己,您也可能获得更好的性能指标,只是发送整个数据块。 主要是非常小的数据块。 显然,随着您需要传输的数据变得更大,将会有一个转折点,但是在转折点的位置没有明显的变化,而没有进行某种度量。 这里的诀窍是数据越大,差异计算所需的时间越长。 转折点只取决于每种方法的增长率所形成的两条线的交点,这两条线都将呈线性或更差,这取决于您的差异如何实施。 在最糟糕的情况下,你可能会看到一个中间的岛屿,在这个岛屿中,差异获得更好的性能,但随后再次返回以获得更大的数据集,并且只是简单地通过网络发送它就再次更好。

    在尝试差异之前下一站,是通过将数据访问包装在跟踪所做更改的“获取”,“设置”和“删除”方法中。 通过线路发送的数据本质上是这些方法使用的顺序记录,在每次成功传输时从客户端刷新。 在服务器端,您可以使用服务器端类似于您的数据访问方法将此日志应用于您的服务器端数据。 这是一个比diff更轻的解决方案,不需要太多的处理能力。

    最后,如果你打算做差异分析,我能想到的最有效的方法是如果你可以将数据集分解成离散的“块”,每个块都有唯一的ID。 然后当你运行diff时,diff的过程正好处于“块”级别。 也就是说,您唯一的比较是ID到ID。 如果你改变一个块,给它一个新的ID。 您可以使用差分算法进行分析的时间越短,运行时间就越短。

    或者,您可以简单地运行diff来检查特定对象是否“已更改”,只要您检测到更改就立即停止,并简单地将该块标记为重新发送使用相同的ID更新服务器端的块。 如果你有一些快速的哈希算法可以用来快速建立平等,那么这可以变得更加高效。

    如果块的顺序无关紧要,或者可以将序列存储为块本身的属性,而不是通过块的物理顺序进行建模,那么您甚至可以通过ID键入块。 然后发现差异仅仅是列出对象A的键,然后在对象B上查找它们,然后再查看它们的副本Versa。 这比“真正的”差异算法实现起来要简单得多,它具有O(a + b)性能(我认为)比真实差异算法最糟糕的情况要好,如果你试图自己实现它,或者实施得不好。


    EtherPad通过将每个源变化转换为可交换,关联等数学运算来解决了这样的问题。然而,我认为这是一个非平凡的问题,而EtherPad能够围绕这个问题的解决方案形成业务。

    编辑:有趣的是,这正是像Git这样的好DVCS解决的问题,而不是浏览器。


    我今天发布了一个在两个JS对象之间做一个diff的小jQuery插件。 http://plugins.jquery.com/project/jquery-diff

    我将它用于一个应用程序,只发送修改后的数据给服务器后端。

    链接地址: http://www.djcxy.com/p/47111.html

    上一篇: How to push diffs of data (possibly JSON) to a server?

    下一篇: Tab and pre wrapped around JSON output in Chrome