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遍历数组的方法小结
Apr 30 Python
python3之模块psutil系统性能信息使用
May 30 Python
Python基于opencv实现的简单画板功能示例
Mar 04 Python
python使用mitmproxy抓取浏览器请求的方法
Jul 02 Python
python使用Matplotlib改变坐标轴的默认位置
Oct 18 Python
tensorflow 初始化未初始化的变量实例
Feb 06 Python
Python对象的属性访问过程详解
Mar 05 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
Jul 01 Python
python 19个值得学习的编程技巧
Aug 15 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
Nov 06 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
Dec 10 Python
Pytorch可视化的几种实现方法
Jun 10 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二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
PHP常用正则表达式集锦
2014/08/17 PHP
JavaScript中读取和保存文件实例
2014/05/08 Javascript
jQuery制作拼图小游戏
2015/01/12 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
2016/09/24 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
详解如何webpack使用DllPlugin
2018/09/30 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
Vuex的各个模块封装的实现
2020/06/05 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
[46:25]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第二局
2016/03/05 DOTA
Python使用Redis实现作业调度系统(超简单)
2016/03/22 Python
Python字典简介以及用法详解
2016/11/15 Python
利用Python生成文件md5校验值函数的方法
2017/01/10 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
PyQt 线程类 QThread使用详解
2017/07/16 Python
Python图形绘制操作之正弦曲线实现方法分析
2017/12/25 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
求职自荐信范文格式
2013/11/29 职场文书
四川省传达学习贯彻党的群众路线教育实践活动总结大会精神新闻稿
2014/10/26 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏