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调用java的Webservice示例
Mar 10 Python
利用Python中的pandas库对cdn日志进行分析详解
Mar 07 Python
使用python为mysql实现restful接口
Jan 05 Python
python爬虫简单的添加代理进行访问的实现代码
Apr 04 Python
python挖矿算力测试程序详解
Jul 03 Python
python字符串,元组,列表,字典互转代码实例详解
Feb 14 Python
Django认证系统user对象实现过程解析
Mar 02 Python
Python 使用Opencv实现目标检测与识别的示例代码
Sep 08 Python
Python join()函数原理及使用方法
Nov 14 Python
python使用numpy中的size()函数实例用法详解
Jan 29 Python
Python3爬虫RedisDump的安装步骤
Feb 20 Python
分析Python感知线程状态的解决方案之Event与信号量
Jun 16 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面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
PHP连接和操作MySQL数据库基础教程
2014/09/29 PHP
ThinkPHP里用U方法调用js文件实例
2015/06/18 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
检测jQuery.js是否已加载的判断代码
2011/05/20 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
2016/01/28 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
AngularJS控制器之间的数据共享及通信详解
2016/08/01 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
利用原生JS与jQuery实现数字线性变化的动画
2017/02/24 Javascript
使用JS实现图片轮播的实例(前后首尾相接)
2017/09/21 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
layer设置maxWidth及maxHeight解决方案
2019/07/26 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
javascript简单实现深浅拷贝过程详解
2019/10/08 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
用Angular实现一个扫雷的游戏示例
2020/05/15 Javascript
详解Python中with语句的用法
2015/04/15 Python
Python遍历指定文件及文件夹的方法
2015/05/09 Python
基于Python函数的作用域规则和闭包(详解)
2017/11/29 Python
Pytorch高阶OP操作where,gather原理
2020/04/30 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
物理系毕业生自荐书
2014/06/13 职场文书
学习十八大宣传标语
2014/10/09 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
乔迁新居祝福语
2019/11/04 职场文书
基于PostgreSQL/openGauss 的分布式数据库解决方案
2021/12/06 PostgreSQL
抖音动画片,皮皮虾,《治愈系》动画在用这首REMIX作为背景音乐,Anak ,The last world with you完整版
2022/03/16 杂记