我想要的是传输矩阵,例如在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
:
但是,当我在this answer(test2)这样的框架中同时运行4段代码时,serialize
比write.table
花了很多时间。
write.table
的输出为16s(ptn
中的第三个数字)
感谢任何能够担任这么长篇文章的人(以及我糟糕的英语)。 如果我只运行一段代码,命令serialize
可能是最佳答案,但test2中的奇怪事件实际上超出了我的范围。我想知道是否必须使用一些外部工具,如MPI。
答案 0 :(得分:1)
使用read.table
和write.table
,您可以在转移表格之前将表格转换为文字。这将花费时间并增加尺寸。看看serialize()
将矩阵转换为二进制格式。
修改:您似乎无法与多个客户端进行交互。如果你愿意学习一些东西,我会建议像ZeroMQ这样的东西,例如:通过rzmq
包。但是,你必须考虑这个架构。有关几个示例,请参阅http://zguide.zeromq.org/page:all。