2010-11-23 81 views
3

我在我想处理的数据库中有许多记录。基本上,我想运行几个正则表达式替换文本字符串行的标记,并在最后,并将它们写回数据库。关于python multiprocessing的初学者问题?

我想知道多处理是否会加快完成这些任务所需的时间。 我做了

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() 

但显然,所花费的时间比运行所需的时间更高一个单一的线程。这是为什么?有人可以请指教这是一个合适的情况下,或者我在这里做错了什么?

+0

你真的用4次迭代来测试它吗?产生每个过程需要时间。另外,postgresql每个连接只使用一个cpu。所以它可能只是排队4个查询并按顺序运行它们。另外,根据启动每个查询的开销,拆分工作可能无益。另外,还有一些东西只依赖于你的系统,比如后台进程和你正在运行的硬件。 – 2010-11-23 02:33:09

+0

@nate,我用4测试它。我认为我每个进程使用1个连接,但.. – goh 2010-11-23 04:38:37

回答

1

这里有几个问题:

  1. 在你processR功能,它在同一时间发出声音了大量的从数据库记录,抑或是一次读取1行? (每行获取成本非常高,性能也很好。)

  2. 它可能不适用于您的特定应用程序,但由于您正在处理“所有内容”,因此使用数据库可能会比平面文件慢。数据库针对逻辑查询进行了优化,而非针对性处理。在你的情况下,你可以将整个表格列导出为CSV文件,处理它,然后重新导入结果?

希望这会有所帮助。

5

这是为什么?

有人可以请启发在什么情况下多处理提供更好的表现?

这里有一个技巧。

多处理只有当你的瓶颈是一个资源,这是不是共享资源。

共享资源(如数据库)将被拉到8个不同的方向,这几乎没有什么实际好处。

要查找非共享资源,您必须拥有独立的对象。就像已经在记忆中的列表一样。

如果你想从一个数据库工作,你需要得到8件事情开始,然后没有更多的数据库工作。因此,将工作分配到不同处理器的中央查询有时可能是有益的。

或8个不同的文件。请注意,文件系统 - 作为一个整体 - 是共享资源,某些类型的文件访问涉及共享类似磁盘驱动器或目录的文件。

或8个较小步骤的管道。标准的unix管道技巧query | process1 | process2 | process3 >file比其他任何东西都更好,因为管道中的每个阶段都是完全独立的。

这是另一个窍门。您的计算机系统(操作系统,设备,数据库,网络等)非常复杂,以致于简单的理论根本无法解释性能。你需要(a)进行多次测量,(b)尝试几种不同的算法,直到你理解了所有的自由度。

一个问题,例如“有人可以在多处理的情况下提供更好的性能,请指教吗?”没有一个简单的答案。

为了有一个简单的答案,你需要一个更简单得多的操作系统。更少的设备。例如,没有数据库和网络。由于您的操作系统很复杂,因此您的问题没有简单的答案。

1

一般来说,当你的问题受到CPU限制时(即大部分时间CPU运行速度尽可能快),multicpu或多核处理最有帮助。

从你的描述来看,你有一个IO绑定问题:从磁盘到CPU(空闲)需要永久性的处理,然后CPU操作非常快(因为它非常简单)。

因此,加速CPU的运行并没有造成很大的差异。