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的web框架编写MVC配置来使其运行的教程
Apr 30 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
Dec 15 Python
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
python opencv实现切变换 不裁减图片
Jul 26 Python
Python字典对象实现原理详解
Jul 01 Python
pycharm修改文件的默认打开方式的步骤
Jul 29 Python
python垃圾回收机制(GC)原理解析
Dec 30 Python
使用sklearn对多分类的每个类别进行指标评价操作
Jun 11 Python
基于Keras中Conv1D和Conv2D的区别说明
Jun 19 Python
详解如何在PyCharm控制台中输出彩色文字和背景
Aug 17 Python
Python CategoricalDtype自定义排序实现原理解析
Sep 11 Python
将Python代码打包成.exe可执行文件的完整步骤
May 12 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开发不能违背的安全规则 过滤用户输入
2011/05/01 PHP
Session服务器配置指南与使用经验的深入解析
2013/06/17 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
2014/07/28 PHP
PHP中exec与system用法区别分析
2014/09/22 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
2019/03/27 PHP
Javascript var变量隐式声明方法
2009/10/19 Javascript
jQuery prev ~ siblings选择器使用介绍
2013/08/09 Javascript
javascript实现微信分享
2014/12/23 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
JavaScript运动框架 链式运动到完美运动(五)
2017/05/18 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
详解解决小程序中webview页面多层history返回问题
2019/08/20 Javascript
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
2018/07/11 Python
在Python 字典中一键对应多个值的实例
2019/02/03 Python
Python数据可视化:泊松分布详解
2019/12/07 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
Python3 io文本及原始流I/O工具用法详解
2020/03/23 Python
美国领先的奢侈手表在线零售商:WatchMaxx
2017/12/17 全球购物
物业管理毕业生个人的求职信
2013/11/30 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
魂断蓝桥观后感
2015/06/10 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
党员读书活动心得体会
2016/01/14 职场文书
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫
Java实现房屋出租系统详解
2021/10/05 Java/Android
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server
Hive常用日期格式转换语法
2022/06/25 数据库