c++ 共享内存_Python3.8多进程之共享内存

最近发了个宏愿想写一个做企业金融研究的Python框架。拖出Python一看已经更新到了3.8,于是就发现了Python 3.8里新出现的模块:multiprocessing.shared_memory

随手写了个测试。生成一个240MB大小的pandas.DataFrame,然后转换成numpy.recarray。这个DataFarme里包括了datetime,整型和字符串类型的列。使用numpy.recarray的目的是为了保存dtype,这样才能在子进程中正确从共享内存里读数据。 我在子进程中简单地使用numpy.nansum来做计算。第一种方法是使用共享内存,第二种方法是直接将numpy.recarray作为参数传递给子进程。 下图为测试代码的输出。

f6f480c5026e110b6919828e97677410.png

可以看出,使用共享内存的第一种方法只使用了可以忽略不计的内存,并且2秒结束战斗。传参数的方法使用了1.8GB的内存,并且慢得要命,花费200多秒。当然这跟我使用的测试机是一台2017年的12寸MacBook 4-core i5 8G RAM(已停产)有可能,不过侧面也说明在数据足够大的时候,尽量避免没必要的复制和传递还是很有效的。

测试代码如下:

from multiprocessing.shared_memory import SharedMemory
from multiprocessing.managers import SharedMemoryManager
from concurrent.futures import ProcessPoolExecutor, as_completed
from multiprocessing import current_process, cpu_count
from datetime import datetime
import numpy as np
import pandas as pd
import tracemalloc
import timedef work_with_shared_memory(shm_name, shape, dtype):print(f'With SharedMemory: {current_process()=}')# Locate the shared memory by its nameshm = SharedMemory(shm_name)# Create the np.recarray from the buffer of the shared memorynp_array = np.recarray(shape=shape, dtype=dtype, buf=shm.buf)return np.nansum(np_array.val)def work_no_shared_memory(np_array: np.recarray):print(f'No SharedMemory: {current_process()=}')# Without shared memory, the np_array is copied into the child processreturn np.nansum(np_array.val)if __name__ == "__main__":# Make a large data frame with date, float and character columnsa = [(datetime.today(), 1, 'string'),(datetime.today(), np.nan, 'abc'),] * 5000000df = pd.DataFrame(a, columns=['date', 'val', 'character_col'])# Convert into numpy recarray to preserve the dtypesnp_array = df.to_records(index=False)del dfshape, dtype = np_array.shape, np_array.dtypeprint(f"np_array's size={np_array.nbytes/1e6}MB")# With shared memory# Start tracking memory usagetracemalloc.start()start_time = time.time()with SharedMemoryManager() as smm:# Create a shared memory of size np_arry.nbytesshm = smm.SharedMemory(np_array.nbytes)# Create a np.recarray using the buffer of shmshm_np_array = np.recarray(shape=shape, dtype=dtype, buf=shm.buf)# Copy the data into the shared memorynp.copyto(shm_np_array, np_array)# Spawn some processes to do some workwith ProcessPoolExecutor(cpu_count()) as exe:fs = [exe.submit(work_with_shared_memory, shm.name, shape, dtype)for _ in range(cpu_count())]for _ in as_completed(fs):pass# Check memory usagecurrent, peak = tracemalloc.get_traced_memory()print(f"Current memory usage {current/1e6}MB; Peak: {peak/1e6}MB")print(f'Time elapsed: {time.time()-start_time:.2f}s')tracemalloc.stop()# Without shared memorytracemalloc.start()start_time = time.time()with ProcessPoolExecutor(cpu_count()) as exe:fs = [exe.submit(work_no_shared_memory, np_array)for _ in range(cpu_count())]for _ in as_completed(fs):pass# Check memory usagecurrent, peak = tracemalloc.get_traced_memory()print(f"Current memory usage {current/1e6}MB; Peak: {peak/1e6}MB")print(f'Time elapsed: {time.time()-start_time:.2f}s')tracemalloc.stop()

值得一提的是,numpy.ndarraydtype一定不能是object,不然子进程访问共享内存的时候一定segfault,但如果在主进程里访问共享内存就没事。


补充更新一下,上面的测试代码work_with_shared_memory 函数里不能解引用np_array,比如print(np_array),不然会segfault。使用np_array.valnp_array.date则没有问题则是因为这两个column的dtype不是object。而np_array.character_coldtype在这个代码里是object

解决这个问题的办法也很简单,(踩坑无数次后),在to_records()里指定dtype。

np_array = df.to_records(index=False,column_dtypes={'character_col': 'S6'})

这里我们指定character_col为长度为6的字符串。 如果是unicode的话,可以将S6换成U6。 超出指定长度的字符串则会被truncate。

这样就不会有segfault了。重点就是不能有objectdtype

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机主机箱外部介绍图,电脑的主机结构是怎样的 电脑主机结构图【图文】...

在电脑已经普及的今天,基本上每家每户都有电脑了,大家用它来看电影,搜索资料啊,上网啊等等。在我们日常的娱乐方式中,电脑也是我们的娱乐项目之一,至少还是好多人用它看电影和追剧的。但是机器会有故障的时…

C 语言各数据类型的内存映像

点击蓝字关注我们C语言各种数据类型的内存映像&#xff08;32位平台&#xff09;&#xff1a;0 signed char#include <stdio.h> int main() {char min 1<<7;char max (1<<7)-1;for(int imin;i<max;i)if(i<0)printf("%.2X ",(unsigned char…

用java编写一个图书管理系统_手把手教你编写第一个java程序

安装完jdk后我们就可以试着编写第一个java程序了&#xff0c;让我们一起来试试吧&#xff01;第一步点击开始——所有程序——附件——记事本&#xff0c;新建记事本&#xff0c;输入以下代码&#xff1a;class HelloWorld { public static void main(String args[]) { System.…

go micro java_Java Micro Framework:您无法忽略的新趋势

go micro java什么是Java微框架&#xff0c;为什么要使用它们&#xff1f; 每种语言都有权衡。 对于Java&#xff0c;要成为一种安全&#xff0c;经过严格测试&#xff0c;向后兼容的语言&#xff0c;就要在敏捷性和简化方面做出一些牺牲。 无可否认&#xff0c;有些冗长和冗长…

C语言调用C++类成员函数讲解和实例

点击蓝字关注我们1、问题成因C语言与C调用问题原因主要在于C编译器和C编译器的不同。C是过程式语言&#xff0c;C编译器编译后&#xff0c;函数在符号库中就是函数名&#xff0c;没有其他任何附加信息。而C是对象式语言&#xff0c;支持函数重载&#xff0c;C编译器编译后&…

学生命科学要学计算机吗,现在学生物学出路真的有那么不济吗?

最近浏览知乎&#xff0c;看到大规模的生物劝退贴&#xff0c;这些帖子纷纷拿出多个例子&#xff0c;并现身说法&#xff0c;告诫学生物的同学尽早转行&#xff0c;并声称劝退一人胜发7篇CNS。作为网友盛传的天坑之首&#xff0c;生物专业到底有多坑&#xff1f;环球科学曾对北…

java笔试题_Java面试才到笔试就没有然后了?快来签收,高频笔试57题及解答

前言很多人面试之前&#xff0c;可能没有在互联网公司工作过或者说工作过但年头较短&#xff0c;不知道互联网公司技术面试都会问哪些问题&#xff1f; 再加上可能自己准备也不充分&#xff0c;去面试没几个回合就被面试官几个问题打蒙了&#xff0c;甚至笔试都过不了。最后以惨…

java开发错误_每个Java开发人员都必须避免的9个安全错误

java开发错误Checkmarx CxSAST是功能强大的源代码分析&#xff08;SCA&#xff09;解决方案&#xff0c;旨在从根本上识别&#xff0c;跟踪和修复技术和逻辑安全漏洞&#xff1a;源代码。 在这里查看 &#xff01; 自从1995年中期引入Java以来​​&#xff0c;它已经走了很长一…

C语言中常用的标准库函数有哪些?

点击蓝字关注我们标准头文件包括&#xff1a;<asset.h> <ctype.h> <errno.h> <float.h> <limits.h> <locale.h> <math.h> <setjmp.h> <signal.h> <stdarg.h> <…

计算机考试一级考试基础知识,全国计算机等级考试一级msoffice基础知识

全国计算机等级考试一级msoffice基础知识导语&#xff1a;在日常生活中&#xff0c;媒体(Medium &#xff0c;复数形式为Media )是指文字、声音、图像、动画和视频等内容。多媒体(Multimedia )是指能够同时对两种或两种以上媒体进行采集、操作、编辑、存储等综合处理的技术。多…

2008铁路旅客列车时刻表_天津到新沂汽车卧铺大巴车长途汽车发车时刻表

长途大巴网上需要注意什么&#xff01;选择乘坐大巴&#xff0c;是大家出行时的一个好选择&#xff0c;而且长途大巴网上也 很方便&#xff0c;能让大家节省不少的时间&#xff0c;但是网上有许多的要求&#xff0c;可能大家还不清楚。小编就给大家 介绍下长途大巴网上须知。长…

web ua检测_UA Web挑战会议:针对初创公司的SpringIO

web ua检测在本周&#xff0c;我在“后端”部分的UA Web挑战会议上发表了讲话。 我在演讲中选择了一个奇怪的话题-“面向初创企业的SpringIO”。 结果是什么&#xff1f; 我将在下面总结。 在过去三年中&#xff0c;我开发了各种个人Web项目。 我再也没有称它们为“初创公司”…

手把手教你撸一个线程池 - C++版

点击蓝字关注我们前面的文章在手把手教你写 C 语言线程池中&#xff0c;已经实现了 C 语言版的线程池&#xff0c;如果我们也学过 C 的话&#xff0c;可以将其改为 C 版本&#xff0c;这样代码不管是从使用还是从感观上都会更简洁一些。对这些代码做从 C 到 C 的迁移主要用到了…

备忘录怎么用红笔标注_错题本的正确打开方法,你用对了吗?

相信很多考生都会有自己的错题本&#xff0c;可是并不是每个考生的错题本都起到了作用。那么错题本究竟如何做才可以切实可用又可以做的好呢&#xff1f;大禹未来教育收集整理了相关内容&#xff0c;分享给大家&#xff01;1、制作错题本的步骤步骤一&#xff1a;把所有的练习册…

组装台式计算机需要哪些配件,组装电脑需要哪些配件 电脑装机教程图解

DIY电脑一直都是电脑爱好者非常喜欢的&#xff0c;对于电脑爱好者来说&#xff0c;通过自己动手DIY组装电脑&#xff0c;不仅可以更为深刻的认识硬件&#xff0c;了解电脑主机内部结构&#xff0c;还能够学习到安装系统等知识&#xff0c;从中可以带来很多乐趣。今天我们为大家…

C语言代码优化的实用方法大总结

点击蓝字关注我们1、选择合适的算法和数据结构选择一种合适的数据结构很重要&#xff0c;如果在一堆随机存放的数中使用了大量的插入和删除指令&#xff0c;那使用链表要快得多。数组与指针语句具有十分密切的关系&#xff0c;一般来说&#xff0c;指针比较灵活简洁&#xff0c…

怎么取消苹果手机自动续费_手机腾讯视频的vip怎么取消自动续费?

如果是安卓手机直接在腾讯视频的【个人中心】找到【我的VIP会员】即可选择【管理自动续费】取消自动续费。如果是苹果手机需要在Apple ID中找到【订阅】选项&#xff0c;取消订阅即可。以下是详细介绍&#xff1a;1、如果您是安卓手机直接点击进入【腾讯视频】的应用&#xff0…

计算机专业去荷兰还是瑞典,给申请计算机专业的同学几点建议

计算机专业想来是广大美国研究生申请的热门专业&#xff0c; 这里所说的热门&#xff0c;不光指招生人数多&#xff0c; 就业前景优势也是无容置疑的。广大申请者的硬件条件无外乎分为以下几种情况&#xff1a;1、托福80&#xff0c;GRE 3002、托福90 GRE3153、托福100&#xf…

为何某些公司不允许使用C++STL

点击蓝字关注我们最初开始禁用 C STL&#xff0c;是因为早期项目编码实践中留下的惯例&#xff0c;被后来的程序员继承下来。老项目中这种选择尤其地多。不过如果有人将其上升到公司行为在不同项目中全面禁用 STL&#xff0c;则没有必要&#xff0c;而且我倾向于做这种决定的人…

支持向量机python代码_Python中的支持向量机SVM的使用(有实例)

除了在Matlab中使用PRTools工具箱中的svm算法&#xff0c;Python中一样可以使用支持向量机做分类。因为Python中的sklearn库也集成了SVM算法&#xff0c;本文的运行环境是Pycharm。 一、导入sklearn算法包 skleran中集成了许多算法&#xff0c;其导入包的方式如下所示&#xff…