首先,我在这里相当新,我希望我设法清楚地描述问题,如果不能,我可以提供更多代码或信息。
我正在使用Python 2.7和从卫星图像中获取的信息,由许多numpy数组表示。因此,我的数组中的每个值都代表我图像中特定像素位置的信息。我有两个阵列集(植被指数和降雨率) - 每个都包含17个阵列 - 来自17年的数据
现在我想处理这些相当大的numpy数组的统计信息。
到现在为止还挺好。我实现了它并成功测试了一个小测试区域,但在完整图像范围内运行我的代码我得到 MemoryError 。这引出了我的实际问题,因为我在使用Pythons多处理工具时遇到了很多麻烦。我最初的想法是分割我的图像并逐块进行计算。
假设我有一张尺寸为137 x 107(x 17年)的图像,我将其带入一个形状为14659(137 * 107)x 17的阵列中。这意味着我有14659像素,有17个观测值。
例如:随时间的线性回归SciPy需要两个输入数组来执行:linregress(x, y) where x is my vegetation data (17, ) and y = np.arange(len(x))
。
然后我遍历所有像素。这就是我内存耗尽的地方。
所以我的问题是:如何使用多处理进行计算?
我试过了:
我定义我的tile大小= 1000,所以我得到14个子阵列,1000x17和一个659 x 17
我希望对子阵列中的每一列进行回归,因此1000次17 x 1
对于每个子阵列:
jobs = [(i, y_array) for i in sub-array]
slope, intercept, rvalue, pvalue, stderr = pool.map(stats.linregress, jobs)
我收到此错误消息:
multiprocessing.pool.MaybeEncodingError: Error sending result: '[LinregressResult(slope=0.0, intercept=8.0, rvalue=0.0, pvalue=1.0, stderr=126.49110640673517), LinregressResult(slope=-0.84790508832152001, intercept=8.0, rvalue=-0.17307790139143567, pvalue=0.50649559801778987, stderr=1.2458212006864782), (...) Reason: 'PicklingError("Can't pickle <class 'scipy.stats._stats_mstats_common.LinregressResult'>: attribute lookup scipy.stats._stats_mstats_common.LinregressResult failed",)'
所以显然它会计算出一些东西,但是会导致装载错误......
任何人都知道我做错了什么?或者有任何建议如何以不同的方式解决问题?