我有python代码将数据发送到socket(一个相当大的文件)。我应该将其分成1kb块,还是只能conn.sendall(file.read())
可以接受?
答案 0 :(得分:3)
发送操作几乎没有什么区别。 (我假设您正在使用TCP套接字进行此讨论。)
当您尝试发送1K时,内核将获取该1K,将其复制到内核TCP缓冲区,并返回成功(并可能同时开始发送给对等方)。此时,您将发送另一个1K,同样的事情发生。最终,如果文件足够大,并且网络无法足够快地发送,或者接收器无法足够快地耗尽,则数据使用的内核缓冲区空间将达到某个内部限制,并且您的进程将被阻止,直到接收器耗尽了足够的数据。 (TCP的这个限制通常很高 - 取决于操作系统,你可以发送一两兆字节而不用它。)
如果你尝试一次性发送,几乎会发生同样的事情:数据将从缓冲区传输到内核缓冲区,直到/除非达到某些限制。此时,您的进程将被阻止,直到接收方耗尽数据(等等)。
但是,使用第一种机制,您可以发送任何大小的文件而不使用过多的内存 - 您的内存缓冲区(不包括内核TCP缓冲区)只需要1K长。使用sendall
方法,file.read()
会将整个文件读入程序的内存中。如果您尝试使用真正的巨型文件(例如40G或其他东西),那可能会占用更多内存,甚至包括交换空间。
因此,作为一种通用机制,我绝对赞成第一种方法。对于现代架构,我会使用比1K更大的缓冲区大小。确切的数字可能不是太关键;但你可以选择一次适合几个磁盘块的东西,比如256K。