如何优化局域网中的数据传输?

时间:2018-03-31 11:19:53

标签: r sockets data-transfer

我想要的是传输矩阵,例如在R中从NodeA到NodeB的1000x1000矩阵(实际上比这个矩阵更大)。现在我使用下面的代码:

NodeA上:

A<-matrix(0,1000,1000)
Conn1<-socketConnection(port=8000, server=TRUE)
write.table(A,file = Conn1, col.names = FALSE) 

节点B:

HostId<-'x.x.x.x'
Conn2<-socketConnection(host=HostId, port=8000, blocking=TRUE)
A<-read.table(file = Conn2,nrows =1000)

但是当我同时运行4个传输并且矩阵的尺寸满足1.5k(具有~20Mb的矩阵)时,我需要大约30秒来完成数据传输。但是,在我看来,FTP中的数据传输速度大约是10Mb / s,这应该比30s快得多,所以我想知道如何改进我的代码?

提前致谢。

修改

尝试Ralf Stubner's Answer后,发生了一些奇怪的事情:

serialize会覆盖test1

中的write.table
t1<-proc.time()
S<-unserialize(Con,refhook = NULL)
t2<-proc.time() -t1

t3<-proc.time()
S<-read.table(file=Con)
t4<-proc.time() -t3

proc.time()的输出为14s vs 70s

test

但是,当我在this answer(test2)这样的框架中同时运行4段代码时,serializewrite.table花了很多时间。

serialize的输出为101秒(ptn中的第三个数字) enter image description here

write.table的输出为16s(ptn中的第三个数字)

enter image description here

感谢任何能够担任这么长篇文章的人(以及我糟糕的英语)。 如果我只运行一段代码,命令serialize可能是最佳答案,但test2中的奇怪事件实际上超出了我的范围。我想知道是否必须使用一些外部工具,如MPI。

1 个答案:

答案 0 :(得分:1)

使用read.tablewrite.table,您可以在转移表格之前将表格转换为文字。这将花费时间并增加尺寸。看看serialize()将矩阵转换为二进制格式。

修改:您似乎无法与多个客户端进行交互。如果你愿意学习一些东西,我会建议像ZeroMQ这样的东西,例如:通过rzmq包。但是,你必须考虑这个架构。有关几个示例,请参阅http://zguide.zeromq.org/page:all