goh*_*goh 3 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()
Run Code Online (Sandbox Code Playgroud)
但显然,所花费的时间高于运行单个线程所需的时间.为什么会这样?有人请指教,这是一个合适的案例,或者我在这里做错了什么?
为什么会这样?
有人可以指导多处理在哪些情况下提供更好的性能?
这是一招.
只有当您的瓶颈是未共享的资源时,多处理才有用.
共享资源(如数据库)将在8个不同的方向上拉动,这几乎没有什么好处.
要查找非共享资源,您必须具有独立对象.就像已经在内存中的列表一样.
如果你想在数据库中工作,你需要启动8件事,然后不再需要数据库工作.因此,将工作分配到单独的处理器的中央查询有时可能是有益的.
或8个不同的文件.请注意,文件系统 - 作为一个整体 - 是共享资源,某些类型的文件访问涉及共享诸如磁盘驱动器或目录之类的东西.
或者是一个8个较小步骤的管道.标准的unix管道技巧query | process1 | process2 | process3 >file比其他任何东西都更好,因为管道中的每个阶段都是完全独立的.
这是另一个技巧.
您的计算机系统(操作系统,设备,数据库,网络等)非常复杂,简单的理论根本无法解释性能.您需要(a)进行多次测量,并(b)尝试几种不同的算法,直到您了解所有自由度.
像"有人可以指导多处理在哪些情况下可以提供更好的性能吗?"之类的问题.没有一个简单的答案.
为了得到一个简单的答案,你需要一个更简单的操作系统.更少的设备.例如,没有数据库,也没有网络.由于您的操作系统很复杂,因此您的问题没有简单的答案.
| 归档时间: |
|
| 查看次数: |
601 次 |
| 最近记录: |