标签: shared-memory

/ tmp vs./dev/shm用于Linux上的临时文件存储?

我有脚本,需要创建数百个快速连续,小的临时文件,很快就会读回来,然后取消链接.

我的测试表明,即使在中等负载下,也可以将所述文件/tmp放入/dev/shmLinux (磁盘)或(文件系统级共享内存)中.我把它归因于文件系统缓存.

当然,磁盘最终会受到文件系统操作的影响,但是对于多个小的写入读取临时文件,为什么(不)建议使用/dev/shm磁盘支持的目录?您是否注意到在缓存的VFS上使用共享内存目录会有很大的性能提升?

linux shared-memory temporary-files

23
推荐指数
1
解决办法
2万
查看次数

使用numpy数组和共享内存并行化python循环

我知道关于这个主题的几个问题和答案,但是没有找到这个特定问题的满意答案:

什么是简单的共享内存并行化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

23
推荐指数
1
解决办法
2万
查看次数

如果在共享内存中,pthread互斥锁是否可以跨线程工作?

我发现了这个: 快速进程间同步方法

我曾经认为pthread互斥锁只能在同一地址空间中的两个线程之间共享.

那里的问题/答案似乎意味着:

如果我有两个单独的程序A和B.它们有一个共享的内存区域M.我可以将一个pThread互斥锁放在M中,锁定在A中,锁定在B中,在A中解锁; 和B将不再阻止互斥锁.它是否正确?可以在两个独立的进程中共享pThread互斥锁吗?

编辑:我在MacOSX上使用C++.

c++ mutex pthreads process shared-memory

22
推荐指数
3
解决办法
2万
查看次数

如何在C中的分叉进程上使用POSIX信号量?

我想分叉多个进程,然后在它们上使用信号量.这是我尝试过的:

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)

c linux fork semaphore shared-memory

22
推荐指数
1
解决办法
4万
查看次数

在python中的进程之间共享连续的numpy数组

虽然我找到了类似于我的问题的许多答案,但我不相信它已经直接在这里解决了 - 我还有几个问题.共享连续numpy数组的动机如下:

  • 我正在使用在Caffe上运行的卷积神经网络对一系列连续值标签执行图像回归.
  • 图像需要特定的预处理和数据增强.
  • 约束(1)标签的连续性(它们是浮点数)和(2)数据扩充意味着我在python中预处理数据,然后使用内存数据将其作为连续的numpy数组提供Caffe中的一层.
  • 将训练数据加载到内存中相对较慢.我想将它并行化,以便:

(1)我正在编写的python创建了一个"数据处理程序"类,它实例化了两个连续的numpy数组.(2)工作进程在这些numpy数组之间交替,从磁盘加载数据,执行预处理,以及将数据插入numpy数组.(3)同时,python Caffe包装器将数据从另一个阵列发送到GPU以通过网络运行.

我有几个问题:

  1. 是否有可能在连续的numpy数组中分配内存然后将它包装在共享内存对象中(我不确定'对象'是否是正确的术语)使用类似python多处理的Array类?

  2. Numpy数组有一个.ctypes属性,我认为这对于从Array()实例化共享内存数组很有用,但似乎无法确切地确定如何使用它们.

  3. 如果在没有 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,但如果这不可能,我当然愿意使用它.

python numpy shared-memory multiprocessing caffe

22
推荐指数
1
解决办法
1993
查看次数

共享内存与Go通道通信

Go的口号之一是不要通过共享记忆来沟通; 相反,通过沟通分享记忆.

我想知道Go是否允许在同一台机器上运行的两个不同的Go-compiled二进制文件相互通信(即客户端 - 服务器),以及与C++中的boost :: interprocess相比有多快?到目前为止,我看到的所有例子都只说明了相同程序例程之间的通信.

一个简单的Go示例(具有单独的客户端和服务器代码)将非常感谢!

ipc channel shared-memory go goroutine

21
推荐指数
1
解决办法
3157
查看次数

在Linux中使用ipcrm删除共享内存

我正在使用共享内存应用程序,并删除段我使用以下命令:

 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)

究竟发生了什么?内存段真的被删除了吗?

编辑:问题是 - 如下面在接受的答案中所述 - 有两个使用共享内存的进程,直到所有进程都关闭,内存段不会消失.

shared-memory ipcs

20
推荐指数
2
解决办法
8万
查看次数

共享内存,MPI和排队系统

我的unix/windows C++应用程序已经使用MPI进行了并行化:作业被分割为N cpus,并且每个块都是并行执行,非常高效,非常好的速度缩放,工作正确完成.

但是在每个过程中都会重复一些数据,并且由于技术原因,这些数据不能轻易地通过MPI(...)进行分割.例如:

  • 5 Gb的静态数据,为每个进程加载完全相同的东西
  • 可以在MPI中分发的4 Gb数据,使用的CPU越多,每个CPU的RAM越小.

在4 CPU工作中,这意味着至少有20Gb的RAM负载,大部分内存"浪费",这很糟糕.

我正在考虑使用共享内存来减少总体负载,每台计算机只会加载一次"静态"块.

所以,主要问题是:

  • 是否有任何标准的MPI方式在节点上共享内存? 某种现成的+免费图书馆?

    • 如果没有,我将使用boost.interprocess和使用MPI调用来分发本地共享内存标识符.
    • 共享内存将由每个节点上的"本地主机"读取,并以只读方式共享.不需要任何类型的信号量/同步,因为它不会改变.
  • 任何性能损失或特别问题要警惕?

    • (不会有任何"字符串"或过于奇怪的数据结构,一切都可以归结为数组和结构指针)
  • 该作业将在PBS(或SGE)排队系统中执行,如果进程不干净退出,我想知道这些是否会清理特定于节点的共享内存.

c++ mpi shared-memory pbs boost-interprocess

20
推荐指数
2
解决办法
5408
查看次数

在所有PHP进程之间共享变量/内存

是否可以在所有PHP进程之间共享变量和数组而不重复它们

使用memcached,我认为PHP重复使用的内存:
$array = $memcache->get('array');
$ array将包含memcached的副本.

所以我的想法是,可能有一个已定义的静态变量,并在所有进程之间共享.

php shared-memory

19
推荐指数
4
解决办法
2万
查看次数

IPC共享内存和线程内存之间的性能差异

我经常听到,与访问线程之间的进程内存相比,访问进程之间的共享内存段没有性能损失.换句话说,多线程应用程序不会比使用共享内存的一组进程更快(不包括锁定或其他同步问题).

但我怀疑:

1)shmat()将本地进程虚拟内存映射到共享段.必须为每个共享存储器地址执行此转换,并且可能代表显着的成本.在多线程应用程序中,不需要额外的转换:所有VM地址都转换为物理地址,就像在不访问共享内存的常规进程中一样.

2)内核必须以某种方式维护共享内存段.例如,当连接到shm的所有进程都被删除时,shm段仍然处于运行状态,并且最终可以被新启动的进程重新访问.可能存在与shm段上的内核操作相关的一些开销.

多进程共享内存系统是否与多线程应用程序一样快?

linux multithreading ipc shared-memory

19
推荐指数
2
解决办法
1万
查看次数