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抓取某汽车网数据解析html存入excel示例
Dec 04 Python
python映射列表实例分析
Jan 26 Python
将Python中的数据存储到系统本地的简单方法
Apr 11 Python
Python 网页解析HTMLParse的实例详解
Aug 10 Python
Python中pygal绘制雷达图代码分享
Dec 07 Python
Django框架中序列化和反序列化的例子
Aug 06 Python
Django实现文件上传下载
Oct 06 Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 Python
python 伯努利分布详解
Feb 25 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
TensorFlow保存TensorBoard图像操作
Jun 23 Python
python元组打包和解包过程详解
Aug 02 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_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
php实现过滤字符串中的中文和数字实例
2015/07/29 PHP
php根据用户语言跳转相应网页
2015/11/04 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
cnblogs TagCloud基于jquery的实现代码
2010/06/11 Javascript
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
localResizeIMG先压缩后使用ajax无刷新上传(移动端)
2015/08/11 Javascript
详细谈谈javascript的对象
2016/07/31 Javascript
jQuery使用$获取对象后检查该对象是否存在的实现方法
2016/09/04 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
详解Vue.js自定义tipOnce指令用法实例
2018/12/19 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
vue data有值,但是页面{{}} 取不到值的解决
2020/11/09 Javascript
vue 使用rules对表单字段进行校验的步骤
2020/12/25 Vue.js
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
python的else子句使用指南
2016/02/27 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
Python日志打印里logging.getLogger源码分析详解
2021/01/17 Python
如何获取某个日期是当月的最后一天
2013/12/05 面试题
汽车销售顾问求职自荐信
2014/01/01 职场文书
电子银行营销方案
2014/02/22 职场文书
2014幼儿园教育教学工作总结
2014/12/17 职场文书
药店营业员岗位职责
2015/04/14 职场文书
高中数学课堂教学反思
2016/02/18 职场文书
Golang 遍历二叉树
2022/04/19 Golang