首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于python多处理的初学者问题?

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

Stack Overflow用户
提问于 2010-11-23 02:15:51
回答 3查看 624关注 0票数 3

我想要处理的数据库中有很多记录。基本上,我想对文本字符串行的标记运行几个regex替换,并将它们写回数据库。

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

multiprocessing.cpu_count

它返回8。我尝试过这样的方法

代码语言:javascript
复制
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()

但显然,所用的时间比运行单个线程所需的时间要长。为何会这样呢?有人能告诉我,这是一个合适的情况,还是我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-23 02:48:46

以下是几个问题:

  1. 在您的processR函数中,它是一次从数据库中删除大量记录,还是每次取1行?(从性能上讲,每行提取都非常昂贵。)
  2. 可能不适用于您的特定应用程序,但是由于您正在处理“所有”,所以使用数据库的速度可能比平面文件慢。数据库被优化为逻辑查询,而不是seqential处理。在您的示例中,可以将整个表列导出到CSV文件中,然后处理它,然后重新导入结果吗?

希望能帮上忙。

票数 1
EN

Stack Overflow用户

发布于 2010-11-23 02:24:35

,为什么会这样?

有人能告诉我,在什么情况下,多处理才能提供更好的性能?

这里有个窍门。

只有当瓶颈是而不是共享的资源时,多处理才有帮助。

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

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

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

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

或者一条由8个小台阶组成的管道。标准的unix管道技巧query | process1 | process2 | process3 >file比其他任何方法都更好,因为管道中的每个阶段都是完全独立的。

这是另一个窍门。

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

一个类似的问题:“有人能告诉我们,在什么情况下,多处理才能提供更好的性能?”没有一个简单的答案。

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

票数 5
EN

Stack Overflow用户

发布于 2010-11-23 02:35:23

通常,当您的问题受到CPU限制时,多CPU或多核处理最有帮助(也就是说,在CPU运行速度尽可能快的情况下,多CPU或多核处理会花费大部分时间)。

根据您的描述,您有一个IO绑定问题:从磁盘获取数据到CPU (这是空闲的)需要花费很长时间,然后CPU操作非常快(因为它非常简单)。

因此,加速CPU的运行并没有产生很大的影响。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4252126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档