技术标签: 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或这些列表中的任何对象。 子流程仅需要能够引用其中一些对象,而无需为每个子流程复制内存。
*args 和 **kwargs大部分新的Python程序员都需要花上大量时间理解清楚 *args 和**kwargs这两个魔法变量。那么它们到底是什么?其实并不是必须写成*args 和**kwargs。 只有变量前面的 *(星号)才是必须的. 你也可以写成*var 和**vars. 而写成*args 和**kwargs只是一个通俗的命名约定。 那就先看一下*args吧。1、*args 的用法*args 和 **kwargs 主要用于函数定义。 你可以将不定数量的参数传递给一个函数。这里的不定的
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复用
python读取数据库数据输出为excel格式
IIS连接数是指服务器接受浏览者请求的并发连接数。浏览者访问站点,必需通过TCP协议与服务器建立连接。这个连接在读取信息时存在,读取结束后自动关闭。所以,当页面已经完全地显示在浏览者的显示器上时,其连接也就关闭了。通常,某个浏览者访问一个站点时,会占用n个连接,这是由计算机自动处理的,目的是为了加快速度。所以,对于IIS连接数规定为不超过100的服务器空间而言,有时可能仅供几十个人同时访问。
在java环境下读取xml文件的方法主要有5种:DOM、SAX、JDOM、JAXB、dom4j最常用、最好用的dom4j1. DOM(Document Object Model)此 方法主要由W3C提供,它将xml文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个节点 。 因此非常消耗系统性能 ,对比较大的文档不适宜采用DOM方法来解析。 DOM API 直接...
一.在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 ,查看本页面的前提条件来验证你的
使用nodejs和mysql搭建简单的后台服务
参考:https://blog.csdn.net/andybbc/article/details/50607347 https://blog.csdn.net/u011485376/article/details/82633661基本感言一个Javabean通过实现ApplicationContextAware接口简直太棒啦,这样就可以在实现类中获取容易上下文a...
持续更新中。。。另一篇<iOS 总结遇到的各种坑儿>##一、集合返回枚举对象- (NSEnumerator *)keyEnumerator { return [array objectEnumerator];}- (NSEnumerator *)reverseKeyEnumerator { return [array reverseObje...
“”"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通信部分,今天整理下CAN通信的概览知识。从几个概念开始。1 位速率位速率(bit rate),即传输期间单位时间的位数。数字信号系统中,带宽用来标识通讯线路所能传送数据的能力,即在单位时间内通过网络中某一点的最高数据率,常用的单位为bps(bit per second,又称为比特率)。通过多少个物理电平的位及以什么样的方式组合来表示逻辑上的0和1,即位...
lua有八种基础类型:nil、boolean、number、string、userdata、function、thread、table。lua将false和nil视为假,除此之外的其余值视为真。lua在条件测试中,将数字0和空字符串视为真。lua中的数字可以表示任何32位整数,而不会产生四舍五入的错误。逻辑操作符and、or、 not,逻辑操作符将false和nil视为假,其余视为真。逻辑操作符and:如果第一个操作数为假,返回第一个操作数;两操作数为真,返回第二个操作数。逻辑操作符or