在这个线程中,OPbuild议使用mmap()而不是shmget()来获得Linux中的共享内存。 我访问了这个页面和这个页面来获取一些文档,但是第二个文档给出了关于mmap()一个模糊的例子。 作为一个新手,并且需要在两个进程之间共享一些信息(文本forms),我应该使用shmget()方法还是使用mmap() ? 为什么? 谢谢, 短发
我经常需要将一个函数应用于一个非常大的DataFrame (混合数据types)的组,并希望利用多个核心。 我可以从组中创build一个迭代器并使用多处理模块,但是效率不高,因为每个组和结果都必须在进程之间进行消息传递。 有没有办法避免酸洗,甚至完全避免DataFrame的复制? 看起来多处理模块的共享内存function仅限于numpy数组。 还有其他的select吗?
我有两个不同的Windows应用程序(两个不同的人写代码)。 一个用C ++编写,另一个用C#编写。 我需要一些方法来在它们之间共享RAM中的数据。 一个人必须写数据,另一个只读数据。 我应该用什么来使其最有效和快速? 谢谢。
比方说,我创build一个信号量。 如果我分叉一堆subprocess,他们都会使用相同的信号量吗? 另外,假设我在里面创build了一个带有信号量的分叉结构。 所有的subprocess仍然使用相同的信号量吗? 如果没有,将存储结构+信号量共享内存允许subprocess使用相同的信号量? 我真的很困惑如何我的分叉subprocess可以使用相同的信号量。
我有一个非常大的(只读)数据数组,我想要由多个进程并行处理。 我喜欢Pool.map函数,并希望使用它来并行计算该数据上的函数。 我看到可以使用Value或Array类在进程之间使用共享内存数据。 但是当我尝试使用这个时,我得到了一个RuntimeError:'SynchronizedString对象应该只在使用Pool.map函数时通过inheritance在进程之间共享: 这是我正在尝试做的一个简单的例子: 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 […]
我有三个大名单。 首先包含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] 这些数据结构需要相当多的RAM(总共约16GB)。 如果我开始使用12个subprocess: multiprocessing.Process(target=someFunction, args=(l1,l2,l3)) 这是否意味着将为每个子stream程复制l1,l2和l3,或者这些子stream程是否会共享这些列表? 或者更直接的,我会使用16GB或192GB的RAM吗? someFunction将从这些列表中读取一些值,然后根据读取的值执行一些计算。 结果将返回到父进程。 列表l1,l2和l3不会被某些函数修改。 因此,我会假设子stream程不需要也不会复制这些庞大的列表,而只是将它们与父级分享。 也就是说,由于linux下的copy-on-write方法,程序会占用16GB的内存(无论启动多less个subprocess)? 我是正确的,还是我错过了会导致列表被复制的东西? 编辑 :我仍然困惑,在阅读了更多的主题后。 一方面,Linux使用copy-on-write,这意味着没有数据被复制。 另一方面,访问对象将改变它的ref-count(我仍然不确定为什么,这是什么意思)。 即使如此,整个对象是否会被复制? 例如,如果我定义一些function,如下所示: def someFunction(list1, list2, list3): i=random.randint(0,99999) print list1[i], list2[i], list3[i] 使用这个函数是否意味着l1,l2和l3将被完全复制到每个subprocess? 有没有办法检查这个? […]
我有一个60GB的SciPyarrays(matrix),我必须共享5个以上的multiprocessing Process对象。 我见过numpy-sharedmem并阅读SciPy列表上的这个讨论 。 似乎有两种方法 – numpy-sharedmem和使用multiprocessing.RawArray()和映射NumPy dtype s到ctype 。 现在, numpy-sharedmem似乎是要走的路,但我还没有看到一个很好的参考例子。 我不需要任何types的锁,因为数组(实际上是一个matrix)将是只读的。 现在,由于它的大小,我想避免一个副本。 这听起来像正确的方法是创build数组的唯一副本作为sharedmem数组,然后将其传递给Process对象? 几个具体的问题: 真正将sharedmem句柄传递给子Process() es的最好方法是什么? 我需要一个队列来传递一个数组吗? 一个pipe道会更好? 我可以只是将它作为parameter passing给Process()子类的init(我假设它被腌制)? 在上面的链接讨论中,提到numpy-sharedmem不是64位安全的? 我肯定使用一些不是32位寻址的结构。 对RawArray()方法有没有权衡? 越慢越好? 我需要numpy-sharedmem方法的任何ctype-to-dtype映射吗? 有没有人有一个这样的OpenSource代码的例子? 我是一个非常实际的学习,如果没有任何一个好的例子来看待这个问题,很难做到这一点。 如果有任何其他信息可以帮助我们澄清这一点,请发表评论,我会添加。 谢谢! 这需要在Ubuntu Linux和Maybe Mac OS上运行,但可移植性不是一个大问题。
我的一个项目有点问题。 我一直在试图find一个使用fork()共享内存但是没有成功的例子。 基本上情况是,当用户启动程序时,我需要在共享内存中存储两个值: current_path是char * , file_name也是char * 。 根据命令参数的不同,使用fork()启动新进程,并且该进程需要读取和修改存储在共享内存中的current_pathvariables,而file_namevariables是只读的。 有没有一个很好的教程共享内存与示例代码(如果可能),你可以指示我? 谢谢,bleepzter
假设我有一个大内存numpy数组,我有一个函数func ,在这个巨大的数组作为input(连同一些其他参数)。 具有不同参数的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] 如果我使用多处理库,那么这个巨型数组将被多次复制到不同的进程中。 有没有办法让不同的进程共享相同的数组? 这个数组对象是只读的,不会被修改。 更复杂的是,如果arr不是一个数组,而是一个任意的python对象,有没有办法共享呢? [EDITED] 我读了答案,但我仍然有点困惑。 由于fork()是copy-on-write,因此在python多处理库中产生新进程时,不应该调用任何额外的开销。 但是下面的代码表明有一个巨大的开销: from multiprocessing import Pool, Manager import numpy as np; […]
我有一个C ++ .NET应用程序和一个C#.NET应用程序。 我希望他们通过共享内存进行通信。 如何在.NET 2.0版本中可能? 主要是想共享一个队列对象。