Python如何发送与接收大型数组


Posted in Python onAugust 07, 2020

问题

你要通过网络连接发送和接受连续数据的大型数组,并尽量减少数据的复制操作。

解决方案

下面的函数利用 memoryviews 来发送和接受大数组:

# zerocopy.py

def send_from(arr, dest):
  view = memoryview(arr).cast('B')
  while len(view):
    nsent = dest.send(view)
    view = view[nsent:]

def recv_into(arr, source):
  view = memoryview(arr).cast('B')
  while len(view):
    nrecv = source.recv_into(view)
    view = view[nrecv:]

为了测试程序,首先创建一个通过socket连接的服务器和客户端程序:

>>> from socket import *
>>> s = socket(AF_INET, SOCK_STREAM)
>>> s.bind(('', 25000))
>>> s.listen(1)
>>> c,a = s.accept()
>>>

在客户端(另外一个解释器中):

>>> from socket import *
>>> c = socket(AF_INET, SOCK_STREAM)
>>> c.connect(('localhost', 25000))
>>>

本节的目标是你能通过连接传输一个超大数组。这种情况的话,可以通过 array 模块或 numpy 模块来创建数组:

# Server
>>> import numpy
>>> a = numpy.arange(0.0, 50000000.0)
>>> send_from(a, c)
>>>

# Client
>>> import numpy
>>> a = numpy.zeros(shape=50000000, dtype=float)
>>> a[0:10]
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
>>> recv_into(a, c)
>>> a[0:10]
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
>>>

讨论

在数据密集型分布式计算和平行计算程序中,自己写程序来实现发送/接受大量数据并不常见。 不过,要是你确实想这样做,你可能需要将你的数据转换成原始字节,以便给低层的网络函数使用。 你可能还需要将数据切割成多个块,因为大部分和网络相关的函数并不能一次性发送或接受超大数据块。

一种方法是使用某种机制序列化数据——可能将其转换成一个字节字符串。 不过,这样最终会创建数据的一个复制。 就算你只是零碎的做这些,你的代码最终还是会有大量的小型复制操作。

本节通过使用内存视图展示了一些魔法操作。 本质上,一个内存视图就是一个已存在数组的覆盖层。不仅仅是那样, 内存视图还能以不同的方式转换成不同类型来表现数据。 这个就是下面这个语句的目的:

view = memoryview(arr).cast('B')

它接受一个数组 arr并将其转换为一个无符号字节的内存视图。这个视图能被传递给socket相关函数, 比如 socket.send() send.recv_into() 。 在内部,这些方法能够直接操作这个内存区域。例如,sock.send() 直接从内存中发生数据而不需要复制。 send.recv_into() 使用这个内存区域作为接受操作的输入缓冲区。

剩下的一个难点就是socket函数可能只操作部分数据。 通常来讲,我们得使用很多不同的 send() recv_into() 来传输整个数组。 不用担心,每次操作后,视图会通过发送或接受字节数量被切割成新的视图。 新的视图同样也是内存覆盖层。因此,还是没有任何的复制操作。

这里有个问题就是接受者必须事先知道有多少数据要被发送, 以便它能预分配一个数组或者确保它能将接受的数据放入一个已经存在的数组中。 如果没办法知道的话,发送者就得先将数据大小发送过来,然后再发送实际的数组数据。

以上就是Python如何发送与接收大型数组的详细内容,更多关于Python发送接收大型数组的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python在多玩图片上下载妹子图的实现代码
Aug 13 Python
使用Python抓取模板之家的CSS模板
Mar 16 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
Apr 29 Python
Python Flask框架扩展操作示例
May 03 Python
python自定义时钟类、定时任务类
Feb 22 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
Django ORM filter() 的运用详解
May 14 Python
如何理解Python中的变量
Jun 01 Python
keras-siamese用自己的数据集实现详解
Jun 10 Python
django数据模型中null和blank的区别说明
Sep 02 Python
python爬虫--selenium模块
Mar 31 Python
Python使用scapy模块发包收包
May 07 Python
Python如何实现远程方法调用
Aug 07 #Python
记一次django内存异常排查及解决方法
Aug 07 #Python
python正则表达式 匹配反斜杠的操作方法
Aug 07 #Python
Pygame框架实现飞机大战
Aug 07 #Python
python爬取网易云音乐热歌榜实例代码
Aug 07 #Python
Python变量格式化输出实现原理解析
Aug 06 #Python
Python实现Canny及Hough算法代码实例解析
Aug 06 #Python
You might like
PHP+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
php获取发送给用户的header信息的方法
2015/03/16 PHP
java script编程起步(第三课)
2007/01/10 Javascript
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
自写的一个jQuery圆角插件
2010/10/26 Javascript
关于jQuery UI 使用心得及技巧
2012/10/10 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
vue2.0 常用的 UI 库实例讲解
2017/12/12 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
jQuery实现定时隐藏对话框的方法分析
2018/02/12 jQuery
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
[01:15:15]VG VS EG Supermajor小组赛B组胜者组第一轮 BO3第二场 6.2
2018/06/03 DOTA
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
python模拟鼠标拖动操作的方法
2015/03/11 Python
tensorflow: variable的值与variable.read_value()的值区别详解
2018/07/30 Python
python使用thrift教程的方法示例
2019/03/21 Python
Python求均值,方差,标准差的实例
2019/06/29 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
可持续木材、生态和铝制太阳镜:Proof Eyewear
2019/07/24 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
Java的基础面试题附答案
2016/01/10 面试题
暑期社会实践感言
2014/02/25 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
2015年社会实践个人总结
2015/03/06 职场文书
保护环境建议书作文400字
2015/09/14 职场文书