我公司收到一个需要重构的非常老旧的程序。代码是一堆 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(越接近线程数越好)。
如果你是一个喜欢自讨苦吃的人或者有一个试验台,可以比较一下有和没有&的执行时间