【问题标题】:Fastest way to transfer large arrays via sockets通过套接字传输大型阵列的最快方法
【发布时间】:2015-10-11 22:11:27
【问题描述】:

我试图将大量数据(长整数数组)从多 (8) 台远程计算机传输到单台计算机(主进程)。所有这些都通过 100 MBps 的 LAN 连接并且是相同的机器(所以不用担心字节序)。

每台远程机器都有一个 8GB 长的 int 数组,我必须将它传输到单台计算机进行处理。我的问题是将这些数组快速转移到主进程的最佳方法是什么。我尝试使用传统的 TCP 来完成这项工作,传输数据需要很长时间(大约 28 分钟)。有什么办法可以提高这个速度吗? .切换到 UDP 对我有帮助吗?使用多个端口/套接字会帮助我缓冲吗?解决此类问题的最佳方法是什么?

我可能无法压缩数据(因为它们中的大多数都是唯一的)并且我需要发送所有内容(因为我在主进程中执行重要操作)

【问题讨论】:

  • 只是一个想法 - 你尝试过压缩吗?
  • 您真的需要一次传输所有数据吗?也许您可以将它存储在某个地方(例如,在某个数据库中)并按块增量获取它?如果您不解释这些数据到底是什么以及它来自哪里,我们将无能为力......
  • 尝试将算法移动到数据中,而不是将数据移动到算法中。也许 map-reduce 可以帮助你。
  • 如果您算一算,在 100mbps 网络上传输 8GB 数据至少需要 11 分钟。这可以接受吗?
  • 刚刚注意到我犯了一个愚蠢的错误,输入 b 而不是 B。这是 100MBps 对不起,伙计们。

标签: c++ c arrays sockets


【解决方案1】:

您可以尝试压缩您的数组。您可以找到几种算法,post 可能会对您有所帮助。它解释了三种最著名的无损算法:
1. Huffman 一种基于树的算法,它有很多应用和专业化
2. RLE for Run-length encoding 非常适合图标压缩
3. LZ77 使用字典,是许多不同算法的基础

您需要无损算法,因为您不想丢失阵列中的数据。这就是我不推荐 UDP 的原因,因为它不检查是否已收到数据。

【讨论】:

  • 请从您的链接中引用相关信息,因为链接的信息可能会更改或被完全删除。
  • 我添加了精度,希望现在更好
  • 太好了,谢谢! (对于未来:人们倾向于投票删除仅链接的答案)
【解决方案2】:

首先,升级您的硬件。使用 1GB NIC(或 10GB,如果您有预算)和一个不错的交换机,您无需编码即可获得 10 倍的提升,传输 8GB 数据大约需要只需一分钟。使用 NIC 绑定将其推得更远,您再次将其加倍到 只需 30 秒(或比您的速度快 60 倍)。

接下来,调整你的算法,是否需要频繁发送整个 8GB 数据?您能否通过管道传输、以流方式执行或仅发送差异(副本),从而获得良好的数据处理吞吐量?

您可以做的最后一件事是压缩,最好分块进行,这样您就不会一次压缩整个 8GB。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多