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代码检查工具pylint 让你的python更规范
Sep 05 Python
总结Python中逻辑运算符的使用
May 13 Python
python里使用正则表达式的组嵌套实例详解
Oct 24 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 Python
Python 实现在文件中的每一行添加一个逗号
Apr 29 Python
python随机在一张图像上截取任意大小图片的方法
Jan 24 Python
Python 编程速成(推荐)
Apr 15 Python
Python调用C语言的实现
Jul 26 Python
Python 解码Base64 得到码流格式文本实例
Jan 09 Python
Python开发入门——迭代的基本使用
Sep 03 Python
如何利用Python写个坦克大战
Nov 18 Python
Python入门基础之数字字符串与列表
Feb 01 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
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
php简单解析mysqli查询结果的方法(2种方法)
2016/06/29 PHP
PHP操作路由器实现方法示例
2019/04/27 PHP
php array_map()函数实例用法
2021/03/03 PHP
js window.onload 加载多个函数的方法
2009/11/02 Javascript
javascript 混合的构造函数和原型方式,动态原型方式
2009/12/07 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
Extjs单独定义各组件的实例代码
2013/06/25 Javascript
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
jquery实现焦点图片随机切换效果的方法
2015/03/12 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
2016/02/28 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
2016/05/19 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
总结十个Angular.js由浅入深的面试问题
2016/08/26 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
谈谈第三方App接入微信登录 解读
2016/12/27 Javascript
HTML5实现微信拍摄上传照片功能
2017/04/21 Javascript
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
Python切片知识解析
2016/03/06 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
django 自定义filter 判断if var in list的例子
2019/08/20 Python
Python request操作步骤及代码实例
2020/04/13 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
使用postMessage让 iframe自适应高度的方法示例
2019/10/08 HTML / CSS
英国独特的时尚和生活方式品牌:JOY
2018/03/17 全球购物
迪士尼英国官方商店:shopDisney UK
2019/09/21 全球购物
软件工程专业推荐信
2013/10/28 职场文书
安全教育主题班会总结
2015/08/14 职场文书
css3应用示例:新增的选择器
2022/03/16 HTML / CSS
KVM基础命令详解
2022/04/30 Servers