我想在共享内存中使用numpy数组与多处理模块一起使用.困难是使用它像一个numpy数组,而不仅仅是一个ctypes数组.
from multiprocessing import Process, Array
import scipy
def f(a):
a[0] = -a[0]
if __name__ == '__main__':
# Create the array
N = int(10)
unshared_arr = scipy.rand(N)
arr = Array('d', unshared_arr)
print "Originally, the first two elements of arr = %s"%(arr[:2])
# Create, start, and finish the child processes
p = Process(target=f, args=(arr,))
p.start()
p.join()
# Printing out the changed values
print "Now, the first two elements of arr = %s"%arr[:2]
Run Code Online (Sandbox Code Playgroud)
这会产生如下输出:
Originally, the first two elements of arr = …Run Code Online (Sandbox Code Playgroud) 我正在尝试在python中实现具有200k +数据点的1000维数据的算法.我想使用numpy,scipy,sklearn,networkx和其他有用的库.我想执行所有点之间的成对距离等操作,并在所有点上进行聚类.我已经实现了以合理的复杂度执行我想要的工作算法但是当我尝试将它们扩展到我的所有数据时,我用完了ram.我当然这样做,在200k +数据上创建成对距离的矩阵需要很多内存.
接下来是:我真的很想在具有少量内存的糟糕计算机上执行此操作.
有没有可行的方法让我在没有低ram限制的情况下完成这项工作.它需要更长的时间才真正不是问题,只要时间要求不会无限!
我希望能够让我的算法工作,然后在一小时或五个小时后回来,而不是因为它用完了公羊而被卡住了!我想在python中实现它,并能够使用numpy,scipy,sklearn和networkx库.我希望能够计算到我所有点的成对距离等
这可行吗?我将如何解决这个问题,我可以开始阅读哪些内容?
最好的问候//梅斯默
我有一个python进程作为WSGI-apache服务器.我有几个机器上运行的这个过程的许多副本.我的进程大约200兆字节是只读的python数据.我想将这些数据放在内存映射段中,以便进程可以共享这些数据的单个副本.最好是能够附加到这些数据,因此它们可能是实际的python 2.7数据对象,而不是像pickle或DBM或SQLite那样解析它们.
有没有人有一个示例代码或指向已完成此项共享的项目的指针?
我想将硬盘上的大型Fortran记录(12G)映射到numpy数组.(映射而不是加载以节省内存.)
存储在fortran记录中的数据不是连续的,因为它除以记录标记.记录结构为"标记,数据,标记,数据,......,数据,标记".数据区域和标记的长度是已知的.
标记之间的数据长度不是4个字节的倍数,否则我可以将每个数据区域映射到数组.
可以通过在memmap中设置偏移来跳过第一个标记,是否可以跳过其他标记并将数据映射到数组?
为可能的模糊表达道歉并感谢任何解决方案或建议.
5月15日编辑
这些是fortran无格式文件.存储在记录中的数据是(1024 ^ 3)*3 float32数组(12Gb).
大小超过2千兆字节的可变长度记录的记录布局如下所示:

(有关详细信息,请参阅此处 - > [记录类型] - > [可变长度记录]部分.)
在我的情况下,除了最后一个,每个子记录的长度为2147483639字节,相隔8个字节(如上图所示,前一个子记录的结束标记和后一个子标记的开始标记,8个字节)总计).
我们可以看到第一个子记录以某个浮点数的前3个字节结束,第二个子记录以其余的1个字节开始,如2147483639 mod 4 = 3.
我正在使用Python 3.4.3和OpenCV 3.0.0来处理(应用各种过滤器)内存中非常大的图像(80,000 x 60,000),我想使用多个CPU内核来提高性能.经过一些阅读,我得到了两种可能的方法:1)使用python的multiprocessing模块,让每个进程处理一大片大图像并在处理完成后加入结果(这可能应该在POSIX系统上执行?)2)由于NumPy支持OpenMP,而OpenCV使用NumPy,我可以将多处理留给NumPy吗?
所以我的问题是:
哪一个会是更好的解决方案?(如果它们看起来不合理,那么可能的方法是什么?)
如果选项2是好的,我应该用OpenMP构建NumPy和OpenCV吗?我如何实际进行多处理?(我真的找不到有用的指示..)
这里有一个基准测试代码来说明我的问题:
import numpy as np
import multiprocessing as mp
# allocate memory
%time temp = mp.RawArray(np.ctypeslib.ctypes.c_uint16, int(1e8))
Wall time: 46.8 ms
# assign memory, very slow
%time temp[:] = np.arange(1e8, dtype = np.uint16)
Wall time: 10.3 s
# equivalent numpy assignment, 100X faster
%time a = np.arange(1e8, dtype = np.uint16)
Wall time: 111 ms
Run Code Online (Sandbox Code Playgroud)
基本上我想要在多个进程之间共享一个numpy数组,因为它很大且只读.这种方法效果很好,不需要额外的副本,并且过程的实际计算时间也很好.但是创建共享阵列的开销是巨大的.
这篇文章提供了一些很好的见解,为什么某些初始化数组的方法很慢(请注意,在上面的例子中,我使用的是更快的方法).但这篇文章并没有真正描述如何真正提高速度,使其像性能一样难以捉摸.
有没有人对如何提高速度有任何建议?一些cython代码是否有意义分配数组?
我正在使用Windows 7 x64系统.
多处理是一个很棒的工具,但不是那么直接使用大内存块.您可以在每个进程中加载块并将结果转储到磁盘上,但有时您需要将结果存储在内存中.最重要的是,使用花哨的numpy功能.
我已经阅读/ google了很多,并提出了一些答案:
如何在python子进程之间传递大型numpy数组而不保存到磁盘?
等等
他们都有缺点:不那么主流的图书馆(sharedmem); 全局存储变量; 不太容易阅读代码,管道等
我的目标是在我的工作人员中无缝使用numpy而不用担心转换和事情.
经过多次试验,我想出了这个.它适用于我的ubuntu 16,python 3.6,16GB,8核心机器.与以前的方法相比,我做了很多"快捷方式".没有全局共享状态,没有需要转换为numpy inside worker的纯内存指针,作为进程参数传递的大型numpy数组等.
上面是Pastebin链接,但我会在这里放几个片段.
一些进口:
import numpy as np
import multiprocessing as mp
import multiprocessing.sharedctypes
import ctypes
Run Code Online (Sandbox Code Playgroud)
分配一些共享内存并将其包装成一个numpy数组:
def create_np_shared_array(shape, dtype, ctype)
. . . .
shared_mem_chunck = mp.sharedctypes.RawArray(ctype, size)
numpy_array_view = np.frombuffer(shared_mem_chunck, dtype).reshape(shape)
return numpy_array_view
Run Code Online (Sandbox Code Playgroud)
创建共享数组并在其中放入一些内容
src = np.random.rand(*SHAPE).astype(np.float32)
src_shared = create_np_shared_array(SHAPE,np.float32,ctypes.c_float)
dst_shared = create_np_shared_array(SHAPE,np.float32,ctypes.c_float)
src_shared[:] = src[:] # Some numpy ops accept an 'out' array where to store the …Run Code Online (Sandbox Code Playgroud) 我正在使用在 python 进程之间multiprocessing.Queue传递 numpy 数组float64。这工作正常,但我担心它可能没有达到应有的效率。
根据 的文档multiprocessing,放置在 上的对象Queue将被腌制。调用picklenumpy 数组会产生数据的文本表示,因此空字节被 string 替换"\\x00"。
>>> pickle.dumps(numpy.zeros(10))
"cnumpy.core.multiarray\n_reconstruct\np0\n(cnumpy\nndarray\np1\n(I0\ntp2\nS'b'\np3\ntp4\nRp5\n(I1\n(I10\ntp6\ncnumpy\ndtype\np7\n(S'f8'\np8\nI0\nI1\ntp9\nRp10\n(I3\nS'<'\np11\nNNNI-1\nI-1\nI0\ntp12\nbI00\nS'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\np13\ntp14\nb."
我担心这意味着我的数组被昂贵地转换为原始大小的 4 倍,然后在另一个过程中转换回。
有没有办法以原始未更改的形式通过队列传递数据?
我知道共享内存,但如果这是正确的解决方案,我不确定如何在其上构建队列。
谢谢!
我正在处理一个大约8GB的数据集,我也在使用scikit-learn来训练各种ML模型.数据集基本上是一维的1D向量列表.
如何使数据集可用于多个python进程或如何编码数据集以便我可以使用它multiprocessing的类?我一直在阅读ctypes,我也一直在阅读multiprocessing文档,但我很困惑.我只需要让数据对每个进程都可读,这样我就可以用它来训练模型.
我需要将共享multiprocessing变量作为ctypes吗?
如何将数据集表示为ctypes?
python ctypes python-2.7 scikit-learn python-multiprocessing
我对 Python 很陌生,对并行处理也完全陌生。
我一直在编写代码来分析点状图像数据(想想PALM lite),并尝试使用该模块加速我的分析代码multiprocessing。
对于小数据集,我发现最多四个核心的加速效果相当不错。对于大型数据集,我开始收到断言错误。我尝试制作一个产生相同错误的简化示例,请参见下文:
import numpy as np
import multiprocessing as mp
import os
class TestClass(object):
def __init__(self, data):
super().__init__()
self.data = data
def top_level_function(self, nproc = 1):
if nproc > os.cpu_count():
nproc = os.cpu_count()
if nproc == 1:
sums = [self._sub_function() for i in range(10)]
elif 1 < nproc:
print('multiprocessing engaged with {} cores'.format(nproc))
with mp.Pool(nproc) as p:
sums = [p.apply_async(self._sub_function) for i in range(10)]
sums = [pp.get() for pp in sums]
self.sums = …Run Code Online (Sandbox Code Playgroud)