相关疑难解决方法(0)

在多处理过程之间共享大型只读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万
查看次数

使用python和numpy中的大数据,没有足够的ram,如何在光盘上保存部分结果?

我正在尝试在python中实现具有200k +数据点的1000维数据的算法.我想使用numpy,scipy,sklearn,networkx和其他有用的库.我想执行所有点之间的成对距离等操作,并在所有点上进行聚类.我已经实现了以合理的复杂度执行我想要的工作算法但是当我尝试将它们扩展到我的所有数据时,我用完了ram.我当然这样做,在200k +数据上创建成对距离的矩阵需要很多内存.

接下来是:我真的很想在具有少量内存的糟糕计算机上执行此操作.

有没有可行的方法让我在没有低ram限制的情况下完成这项工作.它需要更长的时间才真正不是问题,只要时间要求不会无限!

我希望能够让我的算法工作,然后在一小时或五个小时后回来,而不是因为它用完了公羊而被卡住了!我想在python中实现它,并能够使用numpy,scipy,sklearn和networkx库.我希望能够计算到我所有点的成对距离等

这可行吗?我将如何解决这个问题,我可以开始阅读哪些内容?

最好的问候//梅斯默

python arrays numpy scipy bigdata

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

来自numpy操作的numpy.memmap

我正在使用从大图像文件创建的相当大的数组.我在使用太多内存时遇到了问题,并决定尝试使用numpy.memmap数组而不是标准numpy.array.我能够创建一个memmap并从我的图像文件中以块的形式加载数据,但我不确定如何将操作的结果加载到memmap.

例如,我的图像文件被读numpy作二进制整数数组.我编写了一个函数,用于缓冲(扩展)True指定数量单元格的任何单元格区域.此函数将输入数组转换为Boolean使用array.astype(bool).我将如何使新Boolean的阵列创建array.astype(bool)一个numpy.memmap数组?

此外,如果存在True比指定缓冲距离更靠近输入数组边缘的单元格,则该函数将向数组边缘添加行和/或列,以允许在现有True单元格周围形成完整的缓冲区.这会改变阵列的形状.是否有可能改变形状numpy.memmap

这是我的代码:

def getArray(dataset):
    '''Dataset is an instance of the GDALDataset class from the
    GDAL library for working with geospatial datasets

    '''
    chunks = readRaster.GetArrayParams(dataset, chunkSize=5000)
    datPath = re.sub(r'\.\w+$', '_temp.dat', dataset.GetDescription())
    pathExists = path.exists(datPath)
    arr = np.memmap(datPath, dtype=int, mode='r+',
                    shape=(dataset.RasterYSize, dataset.RasterXSize))
    if not pathExists:
        for chunk in chunks:
            xOff, yOff, …
Run Code Online (Sandbox Code Playgroud)

python memory arrays numpy

9
推荐指数
1
解决办法
4089
查看次数