2015-07-22 144 views
0

我试图从多台(8台)远程计算机向单台计算机(主进程)传输大量数据(long int数组)。所有这些都通过一个100 MBps的局域网连接,并且是相同的机器(所以不用担心内存不足)。通过套接字传输大型数组的最快方法

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

我可能不会压缩数据(其中大部分是唯一的),我需要发送的一切(我的主要工序进行重要的操作)

+5

只是一个想法 - 你有没有尝试过压缩? –

+0

你真的需要一次发送所有的数据吗?也许你可以将它存储在某个地方(例如,在某个数据库中)并通过块递增获取它?如果您不解释数据的真实含义以及它来自哪里,我们无法提供帮助...... –

+4

尝试将算法移至数据,而不是将数据移至算法。也许map-reduce可以帮助你。 – nwp

回答

2

您可以尝试压缩你的阵列。有几种算法可以找到,这post可能会帮助你。它提供了三种最知名的无损算法的解释:
1.霍夫曼树型算法它有很多应用和专业化
2.游程编码的RLE非常适合图标压缩
3. LZ77它使用一个字典并且是许多不同算法的基础

无损算法是您需要的,因为您不想丢失数组中的数据。这就是为什么我不会推荐UDP的原因,因为它不检查数据是否已被接收。

+0

请引用您链接中的相关信息,因为链接的信息可能会更改或完全删除。 – hlt

+1

我加了精度,希望现在好多了 – Pumkko

+1

太好了,谢谢! (未来:人们倾向于投票删除只有链接的答案) – hlt

3

首先,升级您的硬件。使用1GB网卡(或10GB,如果你有预算)和一个体面的交换机,你可以获得10倍的提升,无需编码,传输8GB数据需要大约,只需一分钟。用NIC绑定进一步推进,你再次加倍到只需 30秒(或比你快60倍)。

接下来,调整你的算法,你是否需要频繁发送整个8GB数据?你可以通过流式处理,还是只发送差异(副本),以便获得良好的数据处理吞吐量?

你可以做的最后一件事是压缩,更好地做块,这样你就不会一次压缩整个8GB。