【问题标题】:How to pass large data between systems如何在系统之间传递大数据
【发布时间】:2015-02-04 04:48:18
【问题描述】:

我有按小时生成的以 XML 格式存储的定价数据。如果存储为 XML,它的大小大约为 100MB。我需要将此数据发送到我的主系统以进行处理。未来,这个数据大小也有可能每 1m 发送一次。

发送这些数据的最佳方式是什么?到目前为止,我的想法是:

- It would be too large to send as JSON to a POST endpoint
- Possible to send it as XML and store it on my server

有没有更优化的方法来做到这一点?

【问题讨论】:

  • 压缩它。使用 gzip 或 bzip2 将 XML 缩小 80% 很常见。您可以使用二进制协议(例如 scp 甚至 ftp)进行复制。 100Meg 不是太大,无法通过 html 发送。我定期下载多演出文件。
  • 另一种思考方式是考虑如何处理数据。您可以将 xml 数据分解为关系数据库或像 mongodb 这样的无 sql 数据库进行处理。这些系统可以进行复制或让您的其他机器远程访问数据库。

标签: python xml json protocol-buffers


【解决方案1】:

正如迈克尔·安德森在回答中提到的,您可能只发送每个系统中更改的差异。

一种方法是引入一个协议,例如 git。

使用 git,您可以:

  1. 在第一个系统上生成数据并推送到私有仓库
  2. 让您的第二个系统提取更改

这比每次都提取整个数据副本要高效得多。

它也将被压缩,并通过加密通道(取决于 git 服务器/服务)

【讨论】:

  • 这是一个非常聪明的主意。另一个优点是,如果发生错误,可以使用完整的提交历史来回滚更改。还有一些同步问题;主人不确定是否已收到更新,什么会触发拉取请求?也许需要一个额外的应用层协议来协调。
  • 我以这种方式设置了一个带有复制功能的 BIND DNS 集群。主域名服务器执行git pull,如果响应不是“已经是最新的”,它将重新生成配置并将区域同步到从属域名服务器,然后重新加载。这个 Python 脚本每隔几分钟就会作为一个 cronjob 运行一次。
【解决方案2】:

假设您在 linux 上并且数据已经写入文件系统中的某个位置,为什么不在 crontab 条目中执行简单的 scprsync 呢?

您可能希望在发送前进行压缩,或者在协议中启用压缩。

如果您的数据只有轻微的变化,您也可以尝试针对之前的版本(使用diff 生成)而不是整个数据发送补丁,然后在另一端重新生成。

【讨论】:

  • rsync 有一个 -z 选项,可以进行即时压缩。
  • 确实,scp-C。它们并不总是像 bzip -9 那样获得良好的压缩效果,但通常足够好。
猜你喜欢
  • 2017-01-09
  • 2017-12-08
  • 2017-02-21
  • 1970-01-01
  • 2011-07-08
  • 2018-01-06
  • 2021-10-24
  • 1970-01-01
相关资源
最近更新 更多