我正在尝试计算总和,并且在并行化代码方面遇到困难。我试图并行化的计算有点复杂(它同时使用了numpy数组和scipy稀疏矩阵)。它吐出一个numpy数组,我想对大约1000个计算中的输出数组求和。理想情况下,我将在所有迭代中保持运行总和。但是,我还无法弄清楚该如何做。
到目前为止,我已经尝试将joblib的Parallel函数和pool.map函数与python的多处理程序包一起使用。对于这两种情况,我都使用一个内部函数返回一个numpy数组。这些函数返回一个列表,我将其转换为numpy数组,然后求和。
但是,在joblib
Parallel函数完成所有迭代之后,主程序将永远不会继续运行(看起来原始作业处于挂起状态,使用0%CPU)。当我使用pool.map时,所有迭代完成后都会出现内存错误。
有没有一种方法可以简单地并行化运行中的数组总和?
编辑 :目标是除了并行执行以下操作。
def summers(num_iters):
sumArr = np.zeros((1,512*512)) #initialize sum
for index in range(num_iters):
sumArr = sumArr + computation(index) #computation returns a 1 x 512^2 numpy array
return sumArr
我想出了如何使用多处理,apply_async和回调将数组的总和并行化,所以我将其发布在这里供其他人使用。我使用的示例页面并行的Python的总和回调类,虽然我没有真正使用该程序包实施。不过,它给了我使用回调的想法。这是我最终使用的简化代码,它可以完成我想要的操作。
import multiprocessing
import numpy as np
import thread
class Sum: #again, this class is from ParallelPython's example code (I modified for an array and added comments)
def __init__(self):
self.value = np.zeros((1,512*512)) #this is the initialization of the sum
self.lock = thread.allocate_lock()
self.count = 0
def add(self,value):
self.count += 1
self.lock.acquire() #lock so sum is correct if two processes return at same time
self.value += value #the actual summation
self.lock.release()
def computation(index):
array1 = np.ones((1,512*512))*index #this is where the array-returning computation goes
return array1
def summers(num_iters):
pool = multiprocessing.Pool(processes=8)
sumArr = Sum() #create an instance of callback class and zero the sum
for index in range(num_iters):
singlepoolresult = pool.apply_async(computation,(index,),callback=sumArr.add)
pool.close()
pool.join() #waits for all the processes to finish
return sumArr.value
我还可以使用并行映射来完成此工作,这在另一个答案中建议。我已经尝试过了,但是没有正确实现。两种方法都有效,我认为这个答案很好地说明了使用哪种方法(映射或apply.async)的问题。对于地图版本,您无需定义Sum类,summers函数将变为
def summers(num_iters):
pool = multiprocessing.Pool(processes=8)
outputArr = np.zeros((num_iters,1,512*512)) #you wouldn't have to initialize these
sumArr = np.zeros((1,512*512)) #but I do to make sure I have the memory
outputArr = np.array(pool.map(computation, range(num_iters)))
sumArr = outputArr.sum(0)
pool.close() #not sure if this is still needed since map waits for all iterations
return sumArr
当我使用spark API运行类似的代码时,它在许多不同的(分布式)作业中运行,并且成功运行。当我运行它时,我的代码(应该做与Spark代码相同的事情),我得到一个堆栈溢出错误。知道为什么吗? 代码如下: 我相信我正在使用与spark相同的所有并行化工作,但它对我不起作用。任何关于使我的代码分发/帮助了解为什么在我的代码中发生内存溢出的建议都将是非常有帮助的
问题内容: 列表理解和映射计算都应该(至少在理论上)相对容易并行化:列表理解内的每个计算都可以独立于所有其他元素的计算来完成。例如在表达式中 每个x * x计算都可以(至少在理论上)并行完成。 我的问题是:是否有任何Python模块/ Python实施/ Python编程技巧可并行化列表理解计算(以便使用所有16/32 / …内核或将计算分布在计算机网格或在云上)? 问题答案: 正如Ken所说
本文向大家介绍如何在varchar列中求和并在MySQL中显示计数?,包括了如何在varchar列中求和并在MySQL中显示计数?的使用技巧和注意事项,需要的朋友参考一下 为此,将GROUP BY与COUNT(*)一起使用。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是对varchar列求和的查询。这将对MALE和FE
我正在尝试设计一个可以从外部服务器获取数据但有限制的web api。我想知道如何最好的设计它是有效率的。 我的api有一个接受输入的endpoint。它是一个类似于的域名。然后,我的endpoint对域进行http调用以获得一个身份验证令牌,然后使用用户名对该域进行另一次调用以获得一些返回给客户端的数据。但是,我的api可以接受多个用户名(逗号分隔,如)。我的web服务器知道每个域的最大并行连接数
问题内容: 我刚接触Python,但仍处于学习曲线的艰难阶段。感谢您的任何评论。 我有一个很大的for循环要运行(在许多迭代中都很大),例如: 我虽然认为这将是一个如何并行化的常见问题,但在Google上搜索了数小时后,我使用“多重处理”模块找到了解决方案,如下所示: 当循环较小时,此方法有效。但是,如果循环很大,这确实很慢,或者如果循环太大,有时会发生内存错误。看来python会首先生成参数列表
问题内容: 我有多行数据共享相同的公司ID。 有没有一种方法可以使用SQL Server Management Studio 2005对所有金额进行“总和”,以便为每个公司ID给我一行数据? 例如,我目前有以下数据…… 我想尝试得到的是....... 有没有办法做到这一点? 任何指向我正确方法的建议都很好。 谢谢, 问题答案:
我有一个Spark2.1工作,在这里我维护多个数据集对象/RDD,它们代表我们底层Hive/HDFS数据存储上的不同查询。我注意到,如果我简单地迭代数据集列表,它们一次执行一个。每个单独的查询都是并行操作的,但是我觉得我们没有通过并行运行不同的数据集来最大化我们的资源。
我试图创建一个控制台应用程序,在那里我从请求总面积的用户那里获取输入,然后我询问用户在该区域中的结构的数量,然后我将值存储在列表中。我尝试做的是通过结构减去总面积,但我不能从列表中求和值