关于python多处理的初学者问题?

时间:2010-11-23 02:15:51

标签: python postgresql multicore

我想要处理的数据库中有许多记录。基本上,我想在文本字符串行的标记和结尾处运行几个正则表达式替换,然后将它们写回数据库。

我想知道多处理是否会加快执行此类任务所需的时间。 我做了一个

  

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

但显然,所花费的时间高于运行单个线程所需的时间。为什么会这样?有人请指教,这是一个合适的案例,或者我在这里做错了什么?

3 个答案:

答案 0 :(得分:5)

  

为什么会这样?

     

有人可以指导多处理在哪些情况下提供更好的性能?

这是一招。

多重处理仅在您的瓶颈是共享的资源时才有用。

共享资源(如数据库)将在8个不同方向上拉动,这几乎没有什么好处。

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

如果你想在数据库中工作,你需要启动8件事,然后再做数据库工作。因此,将工作分配到单独的处理器的中央查询有时可能是有益的。

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

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

这是另一个技巧。

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

像“有人可以指导多处理可以提供更好的表现吗?”之类的问题。没有一个简单的答案。

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

答案 1 :(得分:1)

通常,当您的问题受到CPU限制时,多CPU或多核处理最有帮助(即,大部分时间都在尽可能快地运行CPU)。

根据您的描述,您有一个IO限制问题:从磁盘到CPU(空闲)获取数据需要永远,然后CPU操作非常快(因为它非常简单)。

因此,加速CPU运行并不会产生很大的差异。

答案 2 :(得分:1)

以下是几个问题:

  1. processR函数中,它是否一次从数据库中剔除大量记录,或者一次取出一行? (每次获取行都是非常昂贵的,性能明智。)

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

  3. 希望这会有所帮助。