【问题标题】:How can I optimize data transmission in local area network?如何优化局域网中的数据传输?
【发布时间】:2018-03-31 11:19:52
【问题描述】:

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

节点A:

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 段代码时,serializewrite.table 花费的时间要多。

serialize 的输出是 101s(ptn 中的第三个数字)

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

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

【问题讨论】:

    标签: r sockets data-transfer


    【解决方案1】:

    使用read.tablewrite.table,您可以在传输表格之前将其转换为文本。这将需要时间并增加尺寸。查看serialize() 将矩阵转换为二进制格式。

    编辑:您似乎无法与多个客户互动。如果您愿意学习一些东西,我建议您使用 ZeroMQ 之类的东西,例如通过rzmq 包。不过,您将不得不考虑架构。几个例子见http://zguide.zeromq.org/page:all

    【讨论】:

    • 谢谢!我试试看。
    • 它将我的测试功能提高了大约 5 倍。但是当我同时运行 4 段代码时仍然存在一些问题。 (它实际上比write.table 慢)。不过,感谢您的帮助!
    • @HunterJiang 这很奇怪。 ZeroMQ 可能是一个替代方案。
    • 看来我应该求助于一些外部工具,先学习一些东西。你的努力真的很感谢我,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多