我想要处理的数据库中有很多记录。基本上,我想对文本字符串行的标记运行几个regex替换,并将它们写回数据库。
我想知道,多处理是否加快了完成这些任务所需的时间。我做了一个
multiprocessing.cpu_count
它返回8。我尝试过这样的方法
process = []
for i in range(4):
if i == 3:
limit = resultsSize - (3 * division)
else:
limit = division
#limit and offset indicates the subset of records the function would fetch in the db
p = Process(target=sub_table.processR,args=(limit,offset,i,))
p.start()
process.append(p)
offset += division + 1
for po in process:
po.join()但显然,所用的时间比运行单个线程所需的时间要长。为何会这样呢?有人能告诉我,这是一个合适的情况,还是我做错了什么?
发布于 2010-11-23 02:48:46
以下是几个问题:
processR函数中,它是一次从数据库中删除大量记录,还是每次取1行?(从性能上讲,每行提取都非常昂贵。)希望能帮上忙。
发布于 2010-11-23 02:24:35
,为什么会这样?
有人能告诉我,在什么情况下,多处理才能提供更好的性能?
这里有个窍门。
只有当瓶颈是而不是共享的资源时,多处理才有帮助。
共享资源(如数据库)将被从8个不同的方向拉出,这几乎没有什么真正的好处。
要找到非共享资源,必须有独立的对象.就像一个已经在记忆中的列表。
如果你想从一个数据库工作,你需要开始8件事情,然后不再做数据库工作。因此,将工作分配给不同处理器的中央查询有时是有益的。
或者8个不同的文件。请注意,文件系统--作为一个整体--是一个共享的资源,某些类型的文件访问涉及到共享类似于磁盘驱动器或目录的内容。
或者一条由8个小台阶组成的管道。标准的unix管道技巧query | process1 | process2 | process3 >file比其他任何方法都更好,因为管道中的每个阶段都是完全独立的。
这是另一个窍门。
您的计算机系统(操作系统、设备、数据库、网络等)太复杂了,简单的理论根本解释不了性能。你需要(a)进行几次测量,(b)尝试几种不同的算法,直到你理解所有的自由度。
一个类似的问题:“有人能告诉我们,在什么情况下,多处理才能提供更好的性能?”没有一个简单的答案。
为了得到一个简单的答案,你需要一个简单得多的操作系统。更少的设备。例如,没有数据库,也没有网络。因为您的操作系统很复杂,所以您的问题没有简单的答案。
发布于 2010-11-23 02:35:23
通常,当您的问题受到CPU限制时,多CPU或多核处理最有帮助(也就是说,在CPU运行速度尽可能快的情况下,多CPU或多核处理会花费大部分时间)。
根据您的描述,您有一个IO绑定问题:从磁盘获取数据到CPU (这是空闲的)需要花费很长时间,然后CPU操作非常快(因为它非常简单)。
因此,加速CPU的运行并没有产生很大的影响。
https://stackoverflow.com/questions/4252126
复制相似问题