并行处理实现

并行处理实现

我公司收到一个需要重构的非常老旧的程序。代码是一堆 SQL 指令,由一个以 shell 命令形式编写的程序编排,目的是处理大型空间数据集。

在 shell 命令中间,有这个实现(如下),理论上并行启动几个 psql 进程。我以前从未见过这种情况。

代码获取这个参数numProc,它是将启动的进程的数量。

文档表明 numProc 是机器中可用的核心数。

这个 for 循环遍历 postgresql 数据库中关系的片段,然后将所有内容插入到新表中。

var_proc 用于切分关系,所以它不是这里的重点。

    for ((i=0; i < ${numProc}; i++))
    do
        psql -U $userName -h $databaseServer -d $databaseName -p $portNumber -v var_num_proc=$numProc -v var_proc=$i -f procedure.sql &
    done
    wait
fi 

那么,这真的是并行化吗?这是一种有效的方法吗(假设是需要大量内存的 CPU 密集型任务)?

答案1

是的。这确实是 Parellisation。

如果 PSQL 命令末尾有“&”,则表示该命令将处于后台运行,因此可以同时启动多个命令。“wait”命令将等待所有命令完成。

这可能是一种合理的方法 - 虽然我猜是为旧版本的 Postgres 设计的。不太旧的版本允许调整数据库,以允许单个查询更好地利用并行化和多核,这可能更好,具体取决于过程中的逻辑。

您可以通过查看同时运行的 psql 命令的数量(例如使用 ps)并查看服务器上的负载来在服务器上检查这一点 - 如果它充分利用了 CPU,则负载应该远高于 1(越接近线程数越好)。

如果你是一个喜欢自讨苦吃的人或者有一个试验台,可以比较一下有和没有&的执行时间

相关内容