python 共享内存 模块_python-多处理中的共享内存_weixin_39552037的博客-程序员秘密

技术标签: python 共享内存 模块  

我有三个大名单。 前一个包含位数组(模块位数组0.8.0),其他两个包含整数数组。

l1=[bitarray 1, bitarray 2, ... ,bitarray n]

l2=[array 1, array 2, ... , array n]

l3=[array 1, array 2, ... , array n]

这些数据结构占用大量RAM(总计约16GB)。

如果我使用以下方法启动12个子流程:

multiprocessing.Process(target=someFunction, args=(l1,l2,l3))

这是否意味着将为每个子流程复制l1,l2和l3,或者子流程将共享这些列表? 或者更直接地说,我将使用16GB还是192GB的RAM?

someFunction将从这些列表中读取一些值,然后根据读取的值执行一些计算。 结果将返回到父进程。 列表l1,l2和l3不会被someFunction修改。

因此,我假设子流程不需要,也不会复制这些庞大的列表,而只是与父级共享它们。 意味着由于linux下的写时复制方法,该程序将占用16GB的RAM(无论我启动了多少个子进程)?我是对的还是我遗漏了一些会导致列表被复制的东西?

编辑:在阅读了有关该主题的更多内容后,我仍然感到困惑。 一方面,Linux使用写时复制,这意味着没有数据被复制。 另一方面,访问对象将更改其引用计数(我仍然不确定为什么以及这意味着什么)。 即使这样,是否会复制整个对象?

例如,如果我定义someFunction如下:

def someFunction(list1, list2, list3):

i=random.randint(0,99999)

print list1[i], list2[i], list3[i]

使用此功能是否意味着将为每个子流程完全复制l1,l2和l3?

有办法检查吗?

EDIT2在多了一点并监视子进程运行时系统的总内存使用情况之后,似乎确实为每个子进程复制了整个对象。 这似乎是因为引用计数。

在我的程序中,实际上不需要用于l1,l2和l3的引用计数。 这是因为l1,l2和l3将保留在内存中(不变),直到父进程退出。 在此之前,无需释放这些列表使用的内存。 实际上,我可以肯定的是,在程序退出之前,引用计数将保持高于0(对于这些列表和这些列表中的每个对象)。

所以现在问题变成了,我如何确保对象不会复制到每个子流程? 我是否可以禁用这些列表以及这些列表中每个对象的引用计数?

EDIT3只是一个附加说明。 子流程不需要修改l1、l2和l3或这些列表中的任何对象。 子流程仅需要能够引用其中一些对象,而无需为每个子流程复制内存。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39552037/article/details/111803179

智能推荐

*args 和 **kwargs_*args, **kwargs_-朽木的博客-程序员秘密

*args 和 **kwargs大部分新的Python程序员都需要花上大量时间理解清楚 *args 和**kwargs这两个魔法变量。那么它们到底是什么?其实并不是必须写成*args 和**kwargs。 只有变量前面的 *(星号)才是必须的. 你也可以写成*var 和**vars. 而写成*args 和**kwargs只是一个通俗的命名约定。 那就先看一下*args吧。1、*args 的用法*args 和 **kwargs 主要用于函数定义。 你可以将不定数量的参数传递给一个函数。这里的不定的

微服务架构-高性能Netty服务器-062:NIO多路IO复用底层实现原理_竞风之翼的博客-程序员秘密

062:NIO多路IO复用底层实现原理1 IO多路复用课程原理介绍2 什么是Bio阻塞式io3 使用多线程实现伪异步io优缺点4 NIO模式核心设计技术思想5 Scoekt技术实现非阻塞式的IO操作6 Nio技术多路IO复用底层实现原理7 Java原生Api实现NIO的操作8 Redis为什么单线程能够支持高并发1 IO多路复用课程原理介绍课程内容:1.Bio到Nio架构模式演变的过程2.为什么Redis单线程也能够支持非常高的并发3.NIO架构模式如何使用选择器Selector轮询4.IO复用

IIS连接数_iis 连接数_feifun的博客-程序员秘密

 IIS连接数是指服务器接受浏览者请求的并发连接数。浏览者访问站点,必需通过TCP协议与服务器建立连接。这个连接在读取信息时存在,读取结束后自动关闭。所以,当页面已经完全地显示在浏览者的显示器上时,其连接也就关闭了。通常,某个浏览者访问一个站点时,会占用n个连接,这是由计算机自动处理的,目的是为了加快速度。所以,对于IIS连接数规定为不超过100的服务器空间而言,有时可能仅供几十个人同时访问。

java读取xml文件_iteye_20659的博客-程序员秘密

在java环境下读取xml文件的方法主要有5种:DOM、SAX、JDOM、JAXB、dom4j最常用、最好用的dom4j1. DOM(Document Object Model)此 方法主要由W3C提供,它将xml文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个节点 。 因此非常消耗系统性能 ,对比较大的文档不适宜采用DOM方法来解析。 DOM API 直接...

在Docker上部署Nacos+Redis+Yapi+MongoDB+Rabbitmq+Fastdfs,用Docker Compose管理容器 --快速上手,超详细_刘同学plus的博客-程序员秘密

一.在linux上安装docker1.前提条件:操作系统CentOs7目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。使用 yum 安装(CentOS 7下)Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的

随便推点

spring中ApplicationContextAware浅析使用_任枫丶的博客-程序员秘密

参考:https://blog.csdn.net/andybbc/article/details/50607347 https://blog.csdn.net/u011485376/article/details/82633661基本感言一个Javabean通过实现ApplicationContextAware接口简直太棒啦,这样就可以在实现类中获取容易上下文a...

iOS开发过程中遇到的新奇玩意儿_weixin_33847182的博客-程序员秘密

持续更新中。。。另一篇<iOS 总结遇到的各种坑儿>##一、集合返回枚举对象- (NSEnumerator *)keyEnumerator { return [array objectEnumerator];}- (NSEnumerator *)reverseKeyEnumerator { return [array reverseObje...

Extended kalman filter (EKF) localization:SLAM核心算法(1)_zjguilai的博客-程序员秘密

“”"Extended kalman filter (EKF) localization sample“”"import numpy as npimport mathimport matplotlib.pyplot as pltEstimation parameter of EKFQ = np.diag([0.1, 0.1, np.deg2rad(1.0), 1.0])**2 # ...

汽车CAN总线详解_Demu大叔的博客-程序员秘密

前面的文章已经介绍过基础软件的CAN通信部分,今天整理下CAN通信的概览知识。从几个概念开始。1 位速率位速率(bit rate),即传输期间单位时间的位数。数字信号系统中,带宽用来标识通讯线路所能传送数据的能力,即在单位时间内通过网络中某一点的最高数据率,常用的单位为bps(bit per second,又称为比特率)。通过多少个物理电平的位及以什么样的方式组合来表示逻辑上的0和1,即位...

lua基础总结_lua 不四舍五入_Kris_u的博客-程序员秘密

lua有八种基础类型:nil、boolean、number、string、userdata、function、thread、table。lua将false和nil视为假,除此之外的其余值视为真。lua在条件测试中,将数字0和空字符串视为真。lua中的数字可以表示任何32位整数,而不会产生四舍五入的错误。逻辑操作符and、or、 not,逻辑操作符将false和nil视为假,其余视为真。逻辑操作符and:如果第一个操作数为假,返回第一个操作数;两操作数为真,返回第二个操作数。逻辑操作符or

推荐文章

热门文章

相关标签