我对一些Python套接字编程有疑问。我对套接字很新,可能只是对它们的工作方式了解不足。我需要在运行python应用程序时在两台机器之间传输二进制文件,并且认为执行某些套接字编程比执行系统命令scp或netcat更好/更快。出于某种原因,如果我在我的机器之间传输1GB图像,则需要大约14秒。如果我通过SCP做到它只需要大约9.这似乎很奇怪,因为SCP出了名的慢。我希望我的传输速度可以与netcat相媲美,但我很难实现这一点。
服务器:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 50000))
s.listen(1)
img = open('test.img', 'rb')
client, addr = s.accept()
l = img.read(4096)
while(l):
client.send(l)
l = img.read(4096)
img.close()
s.close()
客户端:
host = ''
port = 50000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
img = open('./newimg.img', 'wb')
l = s.recv(4096)
while(l):
img.write(l)
l = s.recv(4096)
img.close()
s.close()
这显然是非常基本的,并且缺少很多功能和异常处理,但它至少会获得要传输的文件(尽管缓慢)。我显然已从我的代码中删除了一些详细信息,例如“主持人”#39;变量
我该如何改善这个?
谢谢!
答案 0 :(得分:0)
我建议将缓冲区的大小从4096增加到更大的大小。这将减少项目减少执行堆栈操作和Python解释的次数,这可能会提高数据传输的速度。
目前,在4096(4K)字节读取时,您将从一个千兆字节文件的套接字进行262144读/写。如果你可以将缓冲区增加到一个1048576字节(1024K),那么对于一个千兆字节的文件,套接字和文件只会有1024个读/写。这将使系统调用的优化代码做更多的努力。由于我不知道有多少RAM内存可用,因此可能有助于使其尽可能大,但留出一些内存可用一点余量。
例如,在我使用的一个系统中,我们发送了少量数据,无法获得我们预期的性能。我们在一个较大的消息中排列了一堆少量数据,并且能够获得我们所需的性能。从最好的情况来看,我们可以确定我们正在花费一个时间记录来调用系统功能,该功能在堆栈中来回传输少量数据是该问题的一部分。
然而,scp可能仍然可能更快,因为它是编译的机器代码,并且即使它有额外的开销也没有解释。
答案 1 :(得分:0)
使s.recv()的缓冲区大小更大,以便一次接收更多字节