标签: shared-memory

多处理中的共享内存对象

假设我有一个大内存numpy数组,我有一个函数func,它接受这个巨大的数组作为输入(连同一些其他参数).func具有不同参数可以并行运行.例如:

def func(arr, param):
    # do stuff to arr, param

# build array arr

pool = Pool(processes = 6)
results = [pool.apply_async(func, [arr, param]) for param in all_params]
output = [res.get() for res in results]
Run Code Online (Sandbox Code Playgroud)

如果我使用多处理库,那么这个巨型数组将被多次复制到不同的进程中.

有没有办法让不同的进程共享同一个数组?此数组对象是只读的,永远不会被修改.

更复杂的是,如果arr不是一个数组,而是一个任意的python对象,有没有办法分享它?

[EDITED]

我读了答案,但我仍然有点困惑.由于fork()是copy-on-write,因此在python多处理库中生成新进程时不应调用任何额外的成本.但是下面的代码表明存在巨大的开销:

from multiprocessing import Pool, Manager
import numpy as np; 
import time

def f(arr):
    return len(arr)

t = time.time()
arr = np.arange(10000000)
print "construct array = ", time.time() - t;


pool = Pool(processes = 6)

t = …
Run Code Online (Sandbox Code Playgroud)

python parallel-processing numpy shared-memory multiprocessing

112
推荐指数
4
解决办法
10万
查看次数

如何在C中使用Linux共享内存

我的一个项目有点问题.

我一直试图找到一个记录良好的使用共享内存的例子,fork()但没有成功.

基本上情况是,当用户启动程序时,我需要在共享内存中存储两个值:current_pathchar*,file_name也是char*.

根据命令参数,启动一个新进程fork(),该进程需要读取和修改存储在共享内存中的current_path变量,而file_name变量是只读的.

是否有一个很好的共享内存教程和示例代码(如果可能的话),你可以指导我?

谢谢,哔哔声

c linux fork shared-memory

110
推荐指数
5
解决办法
29万
查看次数

有效地将函数并行应用于分组的pandas DataFrame

我经常需要将函数应用于非常大的DataFrame(混合数据类型)组,并希望利用多个核心.

我可以从组中创建一个迭代器并使用多处理模块,但它效率不高,因为必须对每个组和函数的结果进行pickle以便在进程之间进行消息传递.

有没有办法避免酸洗甚至避免DataFrame完全复制?看起来多处理模块的共享存储器功能仅限于numpy数组.还有其他选择吗?

python shared-memory multiprocessing pandas

88
推荐指数
1
解决办法
6744
查看次数

在多处理过程之间共享大型只读Numpy数组

我有一个60GB的SciPy数组(矩阵)我必须在5个以上的multiprocessing Process对象之间共享.我已经看过numpy-sharedmem并在SciPy列表上阅读了这个讨论.似乎有是两个approaches-- numpy-sharedmem和使用multiprocessing.RawArray(),并映射NumPy的dtypes到ctype秒.现在,numpy-sharedmem似乎是要走的路,但我还没有看到一个很好的参考例子.我不需要任何类型的锁,因为数组(实际上是矩阵)将是只读的.现在,由于它的大小,我想避免副本.这听起来像是正确的方法是创建唯一的数组作为副本sharedmem数组,然后将它传递给Process对象?几个具体问题:

  1. 将sharedmem句柄实际传递给子的最佳方法是Process()什么?我是否需要一个队列来传递一个阵列?管道会更好吗?我可以将它作为参数传递给Process()子类的init(我假设它被腌制)吗?

  2. 在上面我讨论过的讨论中,有人提到numpy-sharedmem不是64位安全吗?我肯定使用一些不是32位可寻址的结构.

  3. 这种RawArray()方法是否存在权衡?更慢,更笨?

  4. 我是否需要numpy-sharedmem方法的任何ctype-to-dtype映射?

  5. 有没有人有一些OpenSource代码这样做的例子?我是一个非常亲力实践的人,如果没有任何好的例子,很难让它工作.

如果我可以提供任何其他信息以帮助其他人澄清这一点,请发表评论,我将添加.谢谢!

这需要在Ubuntu Linux和Maybe Mac OS上运行,但可移植性不是一个大问题.

python numpy shared-memory multiprocessing

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

多处理中的共享内存

我有三个大清单.首先包含bitarrays(模块bitarray 0.8.0),另外两个包含整数数组.

l1=[bitarray 1, bitarray 2, ... ,bitarray n]
l2=[array 1, array 2, ... , array n]
l3=[array 1, array 2, ... , array n]
Run Code Online (Sandbox Code Playgroud)

这些数据结构需要相当多的RAM(总共约16GB).

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

multiprocessing.Process(target=someFunction, args=(l1,l2,l3))
Run Code Online (Sandbox Code Playgroud)

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

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

因此,我认为子流程不需要也不会复制这些巨大的列表,而只是与父级共享它们.这意味着由于linux下的写时复制方法,该程序将占用16GB的RAM(无论我启动多少个子进程)?我是正确的还是我错过了会导致列表被复制的内容?

编辑:在阅读了关于这个主题的更多内容后,我仍然感到困惑.一方面,Linux使用copy-on-write,这意味着不会复制任何数据.另一方面,访问该对象将改变其重新计数(我仍然不确定为什么以及这意味着什么).即便如此,是否会复制整个对象?

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

def someFunction(list1, list2, list3):
    i=random.randint(0,99999)
    print list1[i], list2[i], list3[i]
Run Code Online (Sandbox Code Playgroud)

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

有没有办法检查这个?

EDIT2在子流程运行的同时读取更多内容并监视系统的总内存使用情况后,似乎确实为每个子流程复制了整个对象.它似乎是因为引用计数.

在我的程序中实际上不需要l1,l2和l3的引用计数.这是因为l1,l2和l3将保留在内存中(未更改),直到父进程退出.在此之前,不需要释放这些列表使用的内存.事实上,我确信引用计数将保持在0以上(对于这些列表和这些列表中的每个对象),直到程序退出.

所以现在问题变成了,我怎样才能确保不会将对象复制到每个子进程?我可以禁用这些列表和这些列表中的每个对象的引用计数吗?

EDIT3只是一个额外的说明.子进程并不需要修改l1,l2l3或在这些列表中的任何对象.子进程只需要能够引用其中一些对象,而不会导致为每个子进程复制内存.

python shared-memory multiprocessing large-data

56
推荐指数
4
解决办法
8万
查看次数

Linux共享内存:shmget()vs mmap()?

这个线程中,建议使用OP mmap()而不是shmget()在Linux中获取共享内存.我访问了这个页面和这个页面以获得一些文档,但第二个给出了一个模糊的例子mmap().

几乎是一个新手,并且需要在两个进程之间共享一些信息(以文本形式),我应该使用该shmget()方法还是mmap()?为什么?

c linux posix mmap shared-memory

55
推荐指数
2
解决办法
5万
查看次数

如何在Python多处理中将Pool.map与Array(共享内存)结合起来?

我有一个非常大(只读)的数据数组,我希望由多个进程并行处理.

我喜欢Pool.map函数,并希望用它来并行计算该数据的函数.

我看到可以使用Value或Array类在进程之间使用共享内存数据.但是当我尝试使用它时,我得到一个RuntimeError:'SynchronizedString对象只应在使用Pool.map函数时通过继承在进程之间共享:

这是我想要做的简化示例:

from sys import stdin
from multiprocessing import Pool, Array

def count_it( arr, key ):
  count = 0
  for c in arr:
    if c == key:
      count += 1
  return count

if __name__ == '__main__':
  testData = "abcabcs bsdfsdf gdfg dffdgdfg sdfsdfsd sdfdsfsdf"
  # want to share it using shared memory
  toShare = Array('c', testData)

  # this works
  print count_it( toShare, "a" )

  pool = Pool()

  # RuntimeError here
  print pool.map( count_it, [(toShare,key) for key in ["a", …
Run Code Online (Sandbox Code Playgroud)

python pool shared-memory multiprocessing

52
推荐指数
4
解决办法
3万
查看次数

44
推荐指数
4
解决办法
6万
查看次数

何时/为什么在TVar上使用MVar

我觉得TVar很容易使用,即使MVar看起来更简单一些,而TVar更有特色.

所以我的问题很简单,我想要什么条件去MVar而不是TVar?我想任何时候我都不需要事务更新我可以使用一个MVar,但这对我有什么好处?

haskell shared-memory stm

36
推荐指数
2
解决办法
5413
查看次数

在类UNIX系统上删除所有SYSTEM V共享内存和信号量

如何在类UNIX系统上使用单个命令删除所有未使用的信号量和共享内存,例如Ubuntu?

unix linux posix semaphore shared-memory

35
推荐指数
5
解决办法
10万
查看次数