我正在使用xargs
调用python脚本来处理大约3000万个小文件。我希望使用xargs
来并行化进程。我使用的命令是:
find ./data -name "*.json" -print0 |
xargs -0 -I{} -P 40 python Convert.py {} > log.txt
基本上,Convert.py
将读取一个小的json文件( 4kb ),进行一些处理并写入另一个4kb文件。我在一个服务器上运行,它有40个CPU核。在这台服务器上没有其他CPU密集型进程在运行。
通过监视htop (顺便说一下,还有其他好的方法来监视CPU性能吗?),我发现-P 40
没有预期的那么快。有时所有岩芯都会冻结,并在3-4秒内几乎降至零,然后恢复到60-70%。然后,我尝试减少-P 20-30
的并行进程数,但它仍然不太快。理想的行为应该是线性加速。对于xargs的并行使用有什么建议吗?
发布于 2015-04-24 18:00:17
我敢打赌你的问题是蟒蛇。您没有说明正在对每个文件执行什么样的处理,但假设您只是在内存中处理数据,那么运行时间将主要由启动3000万python虚拟机(解释器)所支配。
如果您可以重组您的python程序以获取一个文件列表,而不是一个文件列表,那么您的性能就会得到很大的提高。然后仍然可以使用xargs来进一步提高性能。例如,40个进程,每个处理1000个文件:
find ./data -name "*.json" -print0 |
xargs -0 -L1000 -P 40 python Convert.py
这并不是说python是一种糟糕/慢的语言;它只是没有针对启动时间进行优化。您将在任何基于虚拟机的语言或解释语言中看到这一点。例如,Java就更糟了。如果您的程序是用C编写的,那么启动一个单独的操作系统进程来处理每个文件仍然需要花费,但这要少得多。
在这里,您可以使用-P
来查看是否可以挤出更快的速度,也许可以通过增加进程数量来利用数据读取/写入过程中的空闲处理器。
发布于 2015-04-24 13:03:24
因此,首先,考虑这些限制因素:
每个工作的限制是什么?如果是I/O,那么每个CPU核心可能会有多个作业,直到达到I/O的极限,但是如果它是CPU密集型的,那么它将比同时运行更多的任务更糟糕。
我对这些事情的理解是,GNU并行将使您更好地控制作业队列等。
更详细地解释这两者的区别,请参见GNU并行vs &(我指背景) vs xargs并行。
发布于 2015-04-24 15:19:26
就像其他人说的,检查你是否受I/O约束。此外,xargs的手册页建议将-n
与-P
结合使用,没有提到您看到的并行运行的Convert.py
进程的数量。
作为一个建议,如果您是I/O绑定的,您可以尝试使用SSD块设备,或者尝试在tmpfs中进行处理(当然,在这种情况下,您应该检查是否有足够的内存,避免由于tmpfs压力(我认为)以及将数据复制到tmpfs中的开销)。
https://unix.stackexchange.com/questions/197192
复制相似问题