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登录QQ邮箱发信的实现代码
Feb 10 Python
Python增量循环删除MySQL表数据的方法
Sep 23 Python
Python2包含中文报错的解决方法
Jul 09 Python
python pygame模块编写飞机大战
Nov 20 Python
深入浅析Python2.x和3.x版本的主要区别
Nov 30 Python
PyCharm第一次安装及使用教程
Jan 08 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
Apr 07 Python
基于Python pyecharts实现多种图例代码解析
Aug 10 Python
django跳转页面传参的实现
Sep 17 Python
python 实现性别识别
Nov 21 Python
python 基于selenium实现鼠标拖拽功能
Dec 24 Python
Pillow图像处理库安装及使用
Apr 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中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
ThinkPHP自动完成中使用函数与回调方法实例
2014/11/29 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
2018/04/09 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
IE与firefox之jquery用法区别
2008/10/03 Javascript
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
node.js中的console.error方法使用说明
2014/12/10 Javascript
javascript跨域原因以及解决方案分享
2015/04/08 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
详解JavaScript中的4种类型识别方法
2015/09/14 Javascript
JS实现来回出现文字的状态栏特效代码
2015/10/31 Javascript
jquery+php实现滚动的数字特效
2015/11/29 Javascript
JS简单实现滑动加载数据的方法示例
2017/10/18 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
2018/01/21 jQuery
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
js实现选项卡效果
2020/03/07 Javascript
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
遗传算法python版
2018/03/19 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
python如何写出表白程序
2020/06/01 Python
python实现定时发送邮件到指定邮箱
2020/12/23 Python
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
标记环网Toke Ring IEEE802.5
2014/05/26 面试题
四风查摆剖析材料
2014/10/10 职场文书
学生会自荐信
2019/05/16 职场文书
Python基础之数据类型知识汇总
2021/05/18 Python
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python