我有脚本,需要创建数百个快速连续,小的临时文件,很快就会读回来,然后取消链接.
我的测试表明,即使在中等负载下,也可以将所述文件/tmp放入/dev/shmLinux (磁盘)或(文件系统级共享内存)中.我把它归因于文件系统缓存.
当然,磁盘最终会受到文件系统操作的影响,但是对于多个小的写入读取临时文件,为什么(不)建议使用/dev/shm磁盘支持的目录?您是否注意到在缓存的VFS上使用共享内存目录会有很大的性能提升?
我知道关于这个主题的几个问题和答案,但是没有找到这个特定问题的满意答案:
什么是简单的共享内存并行化python循环的方法是什么?numpy数组是通过numpy/scipy函数操作的?
我不是在寻找最有效的方法,我只想要一些简单的实现,当循环不是并行运行时不需要重大的重写.就像OpenMP在低级语言中实现一样.
我在这方面看到的最好的答案就是这个,但这是一种相当笨重的方式,需要一个人将循环表达成一个带有单个参数的函数,几行共享数组转换crud,似乎需要并行函数从中调用__main__,它似乎从交互式提示(我花了很多时间)中运行良好.
有了Python的所有简单性,这真的是解决循环问题的最佳方法吗?真?这在OpenMP方式中并行化是微不足道的.
我仔细阅读了多处理模块的不透明文档,但却发现它非常通用,除了简单的循环并行化之外它似乎适合所有东西.我对设置Managers,Proxies,Pipes等不感兴趣.我只是有一个简单的循环,完全并行,在任务之间没有任何通信.使用MPI来平行这样一个简单的情况似乎有些过分,更不用说在这种情况下它将是内存效率低下的.
我没有时间去了解Python的众多不同的共享内存并行包,但是想知道是否有人在这方面有更多经验并且可以向我展示一种更简单的方法.请不要建议串行优化技术,如Cython(我已经使用它),或使用并行numpy/scipy函数,如BLAS(我的情况更一般,更平行).
python parallel-processing numpy shared-memory multiprocessing
我发现了这个: 快速进程间同步方法
我曾经认为pthread互斥锁只能在同一地址空间中的两个线程之间共享.
那里的问题/答案似乎意味着:
如果我有两个单独的程序A和B.它们有一个共享的内存区域M.我可以将一个pThread互斥锁放在M中,锁定在A中,锁定在B中,在A中解锁; 和B将不再阻止互斥锁.它是否正确?可以在两个独立的进程中共享pThread互斥锁吗?
编辑:我在MacOSX上使用C++.
我想分叉多个进程,然后在它们上使用信号量.这是我尝试过的:
sem_init(&sem, 1, 1); /* semaphore*, pshared, value */
.
.
.
if(pid != 0){ /* parent process */
wait(NULL); /* wait all child processes */
printf("\nParent: All children have exited.\n");
.
.
/* cleanup semaphores */
sem_destroy(&sem);
exit(0);
}
else{ /* child process */
sem_wait(&sem); /* P operation */
printf(" Child(%d) is in critical section.\n",i);
sleep(1);
*p += i%3; /* increment *p by 0, 1 or 2 based on i */
printf(" Child(%d) new value of *p=%d.\n",i,*p);
sem_post(&sem); /* …Run Code Online (Sandbox Code Playgroud) 虽然我找到了类似于我的问题的许多答案,但我不相信它已经直接在这里解决了 - 我还有几个问题.共享连续numpy数组的动机如下:
(1)我正在编写的python创建了一个"数据处理程序"类,它实例化了两个连续的numpy数组.(2)工作进程在这些numpy数组之间交替,从磁盘加载数据,执行预处理,以及将数据插入numpy数组.(3)同时,python Caffe包装器将数据从另一个阵列发送到GPU以通过网络运行.
我有几个问题:
是否有可能在连续的numpy数组中分配内存然后将它包装在共享内存对象中(我不确定'对象'是否是正确的术语)使用类似python多处理的Array类?
Numpy数组有一个.ctypes属性,我认为这对于从Array()实例化共享内存数组很有用,但似乎无法确切地确定如何使用它们.
如果在没有 numpy数组的情况下实例化共享内存,它是否保持连续?如果没有,有没有办法确保它保持连续?
有可能做这样的事情:
import numpy as np
from multiprocessing import Array
contArr = np.ascontiguousarray(np.zeros((n_images, n_channels, img_height, img_width)), dtype=np.float32)
sm_contArr = Array(contArr.ctypes.?, contArr?)
Run Code Online (Sandbox Code Playgroud)
然后用实例化实例化
p.append(Process(target=some_worker_function, args=(data_to_load, sm_contArr)))
p.start()
Run Code Online (Sandbox Code Playgroud)
谢谢!
编辑:我知道有许多库在不同的维护状态下具有类似的功能.我宁愿将此限制为纯python和numpy,但如果这不可能,我当然愿意使用它.
Go的口号之一是不要通过共享记忆来沟通; 相反,通过沟通分享记忆.
我想知道Go是否允许在同一台机器上运行的两个不同的Go-compiled二进制文件相互通信(即客户端 - 服务器),以及与C++中的boost :: interprocess相比有多快?到目前为止,我看到的所有例子都只说明了相同程序例程之间的通信.
一个简单的Go示例(具有单独的客户端和服务器代码)将非常感谢!
我正在使用共享内存应用程序,并删除段我使用以下命令:
ipcrm -M 0x0000162e (this is the key)
Run Code Online (Sandbox Code Playgroud)
但是我不知道我是否正在做正确的事情,因为当我跑步时,ipcs我会看到相同的段但是键为0x0000000.那么内存片段真的被删除了吗?当我多次运行我的应用程序时,我看到不同的内存段,键为0x000000,如下所示:
key shmid owner perms bytes nattch status
0x00000000 65538 me 666 27 2 dest
0x00000000 98307 me 666 5 2 dest
0x00000000 131076 me 666 5 1 dest
0x00000000 163845 me 666 5 0
Run Code Online (Sandbox Code Playgroud)
究竟发生了什么?内存段真的被删除了吗?
编辑:问题是 - 如下面在接受的答案中所述 - 有两个使用共享内存的进程,直到所有进程都关闭,内存段不会消失.
我的unix/windows C++应用程序已经使用MPI进行了并行化:作业被分割为N cpus,并且每个块都是并行执行,非常高效,非常好的速度缩放,工作正确完成.
但是在每个过程中都会重复一些数据,并且由于技术原因,这些数据不能轻易地通过MPI(...)进行分割.例如:
在4 CPU工作中,这意味着至少有20Gb的RAM负载,大部分内存"浪费",这很糟糕.
我正在考虑使用共享内存来减少总体负载,每台计算机只会加载一次"静态"块.
所以,主要问题是:
是否有任何标准的MPI方式在节点上共享内存? 某种现成的+免费图书馆?
boost.interprocess和使用MPI调用来分发本地共享内存标识符.任何性能损失或特别问题要警惕?
该作业将在PBS(或SGE)排队系统中执行,如果进程不干净退出,我想知道这些是否会清理特定于节点的共享内存.
是否可以在所有PHP进程之间共享变量和数组而不重复它们?
使用memcached,我认为PHP重复使用的内存:
$array = $memcache->get('array');
$ array将包含memcached的副本.
所以我的想法是,可能有一个已定义的静态变量,并在所有进程之间共享.
我经常听到,与访问线程之间的进程内存相比,访问进程之间的共享内存段没有性能损失.换句话说,多线程应用程序不会比使用共享内存的一组进程更快(不包括锁定或其他同步问题).
但我怀疑:
1)shmat()将本地进程虚拟内存映射到共享段.必须为每个共享存储器地址执行此转换,并且可能代表显着的成本.在多线程应用程序中,不需要额外的转换:所有VM地址都转换为物理地址,就像在不访问共享内存的常规进程中一样.
2)内核必须以某种方式维护共享内存段.例如,当连接到shm的所有进程都被删除时,shm段仍然处于运行状态,并且最终可以被新启动的进程重新访问.可能存在与shm段上的内核操作相关的一些开销.
多进程共享内存系统是否与多线程应用程序一样快?