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 opencv3实现人脸识别(windows)
May 25 Python
Python字符串匹配之6种方法的使用详解
Apr 08 Python
python 遍历pd.Series的index和value
Nov 26 Python
Python socket聊天脚本代码实例
Jan 02 Python
在jupyter notebook 添加 conda 环境的操作详解
Apr 10 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
python使用QQ邮箱实现自动发送邮件
Jun 22 Python
Python使用正则表达式实现爬虫数据抽取
Aug 17 Python
python 5个顶级异步框架推荐
Sep 09 Python
解决Python import .pyd 可能遇到路径的问题
Mar 04 Python
Python标准库pathlib操作目录和文件
Nov 20 Python
Python中time标准库的使用教程
Apr 13 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数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
2011/10/31 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
php读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
JS画线(实例代码)
2013/11/20 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
js+html5通过canvas指定开始和结束点绘制线条的方法
2015/06/05 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
基于bootstrap实现广告轮播带图片和文字效果
2016/07/22 Javascript
手机Web APP如何实现分享多平台功能
2016/08/19 Javascript
BootStrap中
2016/12/10 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
JavaScript React如何修改默认端口号方法详解
2020/07/28 Javascript
python访问类中docstring注释的实现方法
2015/05/04 Python
一个基于flask的web应用诞生(1)
2017/04/11 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
2018/10/09 Python
详解python中__name__的意义以及作用
2019/08/07 Python
python实现企业微信定时发送文本消息的示例代码
2020/11/24 Python
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
材料物理专业个人求职信
2013/12/15 职场文书
养成教育经验材料
2014/05/26 职场文书
班组长安全工作职责
2014/07/15 职场文书
学生会竞选演讲稿怎么写
2014/08/26 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
风之谷观后感
2015/06/11 职场文书
2015年团委副书记工作总结
2015/07/23 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js
详解Vue中$props、$attrs和$listeners的使用方法
2022/02/18 Vue.js