标签: parallelism

从并行生成的三个其他流中创建单个输出流

我有三种不同格式的数据;对于每种数据类型,都有一个 Python 脚本将其转换为单一的统一格式。

这个 Python 脚本很慢并且受 CPU 限制(到多核机器上的单核),所以我想运行它的三个实例 - 每个数据类型一个 - 并将它们的输出组合起来将它传递到sort. 基本上,相当于:

{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n
Run Code Online (Sandbox Code Playgroud)

但是三个脚本并行运行。

我发现了这个问题,其中 GNUsplit被用来在处理流的脚本的 n 个实例之间循环一些标准输出流。

从拆分手册页:

-n, --number=CHUNKS
          generate CHUNKS output files.  See below
CHUNKS  may be:
 N       split into N files based on size of input
 K/N     output Kth of N to stdout
 l/N     split into N files without splitting lines
 l/K/N   output Kth of N to stdout without splitting lines
 r/N …
Run Code Online (Sandbox Code Playgroud)

pipe text-processing split parallelism

10
推荐指数
1
解决办法
3225
查看次数

正确的 xargs 并行使用

我正在使用xargs一个 python 脚本来处理大约 3000 万个小文件。我希望用来xargs并行化这个过程。我使用的命令是:

find ./data -name "*.json" -print0 |
  xargs -0 -I{} -P 40 python Convert.py {} > log.txt
Run Code Online (Sandbox Code Playgroud)

基本上,Convert.py会读入一个小的json文件(4kb),做一些处理并写入另一个 4kb 文件。我在具有 40 个 CPU 内核的服务器上运行。并且此服务器上没有运行其他 CPU 密集型进程。

通过监控 htop(顺便说一句,有没有其他好的方法来监控 CPU 性能?),我发现它-P 40没有预期的那么快。有时所有内核会冻结并在 3-4 秒内几乎降至零,然后恢复到 60-70%。然后我尝试将并行进程的数量减少到-P 20-30,但它仍然不是很快。理想的行为应该是线性加速。对 xargs 的并行使用有什么建议吗?

xargs parallelism

10
推荐指数
2
解决办法
9681
查看次数

htop 中有很多红色——这是否意味着我的任务相互绊倒?

在此处输入图片说明

我读过红色表示“内核进程”。这是否意味着小守护进程正在调节哪个任务可以使用 CPU?推而广之,超额认购系统中的交易成本?

我正在运行一些大规模的地理处理作业,并且我有两个同时并行运行的脚本。

第一个脚本在所有 96 个内核上进行实际处理。它负责几乎所有的内存使用。

第二个脚本用于curl下载数据以提供给第一个进程,并且它是并行执行的。我写它只下载直到有n_cores * 3文件下载。如果不满足该约束,它会等待一分钟左右,然后再次检查。所以,大部分时间它没有运行-或者更确切地说,它正在执行Sys.sleep()的命令R

我已经尝试在下载过程中使用更少的内核。当我这样做时,它跟不上处理脚本(我正在从 S3 进行 DLing)。

TL;DR:如果我可以htop减少红色,我的流程会运行得更快吗?它们是不是因为进程数多于核心数而变红?

kernel curl htop r parallelism

10
推荐指数
1
解决办法
8309
查看次数

并行化 for 循环

我想并行化for以下代码的循环。这该怎么做?

#!/bin/bash
N=$1 
n=$2
for (( i=1; i<=$N; i++ )); do
  min=100000000000000  //set min to some garbage value
  for (( j=1; j<=$n; j++ )); do
    val=$(/path/to/a.out)
    val2=`echo $val | bc`  

      if (( $val2 < $min )); then
        min=$val2; 
      fi
  done
  arr=("${arr[@]}" "$min")
done
Run Code Online (Sandbox Code Playgroud)

bash shell-script parallelism

9
推荐指数
2
解决办法
6482
查看次数

如何通过 FTP 并行上传目录?

我需要通过 FTP 上传一个带有相当复杂的树(很多子目录等)的目录。我无法压缩这个目录,因为除了 FTP 之外我没有任何访问目标的权限 - 例如没有 tar。由于这是一个很长的距离(美国 => 澳大利亚),延迟非常高。

遵循如何在 Unix 中使用 mput 将多个文件夹通过 FTP 传输到另一台服务器中的建议,我目前使用的ncftp执行与转移mput -r。不幸的是,这似乎一次传输一个文件,在通信开销上浪费了大量可用带宽。

有什么办法可以并行化这个过程,即同时从这个目录上传多个文件?当然,我可以手动拆分它并mput -r在每个块上执行,但这是一个乏味的过程。

CLI 方法是非常受欢迎的,因为客户端机器实际上是一个通过 SSH 访问的无头服务器。

command-line ftp file-transfer parallelism

9
推荐指数
1
解决办法
1万
查看次数

bash 脚本中的多线程/分叉

我编写了一个 bash 脚本,格式如下:

#!/bin/bash
start=$(date +%s)
inFile="input.txt"
outFile="output.csv"

rm -f $inFile $outFile

while read line
do

    -- Block of Commands

done < "$inFile"

end=$(date +%s)

runtime=$((end-start))

echo "Program has finished execution in $runtime seconds."
Run Code Online (Sandbox Code Playgroud)

while循环将从读取$inFile,上线执行一些活动和转储结果$outFile

由于$inFile有 3500 多行长,脚本完全执行需要 6-7 个小时。为了尽量减少这个时间,我计划在这个脚本中使用多线程或分叉。如果我创建 8 个子进程,$inFile将同时处理 8 行。

如何才能做到这一点?

shell-script multithreading parallelism

9
推荐指数
1
解决办法
2万
查看次数

并行涂油

工作中的海洋学家朋友需要备份数月的数据。她不知所措,所以我自愿去做。有数百个目录需要备份,我们希望将它们 tar/bzip 压缩到与目录同名的文件中。我可以连续轻松地完成此操作 - 但是 - 我想利用我工作站上的数百个内核。

问:使用find与-n -PARGS或GNU并行,我怎么焦油/ bZIP结构的目录,使用尽可能多的内核,同时尽可能的命名最终产品: origonalDirName.tar.bz2

我已经使用 find 同时 bunzip 100 个文件并且它非常快 - 所以这是解决问题的方法,尽管我不知道如何让每个文件名成为每个目录的文件名。

archive shell-script files parallelism

9
推荐指数
1
解决办法
5555
查看次数

如何使函数可用于命令`parallel`(GNU)?

在 Bash 中,让我们考虑一个函数,它除了echo后跟“是一个整数”的参数之外什么都不做。

f () { num="${!1}"; echo $num is an integer; }
number=12
f number
# 12 is an integer
Run Code Online (Sandbox Code Playgroud)

我想在一个文件上写一些使用该函数的命令,f然后使用该函数parallel(GNU)并行运行这些命令。

# Write Commands to the file `Commands.txt`
rm Commands.txt
touch Commands.txt
for i in $(seq 1 5)
do
   echo "number=$i; f number" >> Commands.txt
done
Run Code Online (Sandbox Code Playgroud)

随着source一切工作正常

source Commands.txt
1 is an integer
2 is an integer
3 is an integer
4 is an integer
5 is an integer
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试并行运行命令时,它返回f …

shell bash function parallelism

9
推荐指数
2
解决办法
5626
查看次数

仅使用一个 CPU 内核

我需要为我的并发程序运行性能测试,我的要求是它应该只在一个CPU 内核上运行。(我不想合作线程 - 我希望总是有一个上下文切换)。

所以我有两个问题:

  1. 最佳解决方案 - 如何仅为我的程序签名和保留一个 CPU 内核(以强制操作系统不使用此 CPU 内核)。我想这是不可能的,但也许我错了......

  2. 如何设置 linux (Fedora 24) 只使用一个 CPU 核心?

linux cpu parallelism

9
推荐指数
1
解决办法
8725
查看次数

一个程序在多个文件上并行执行

我有一个小脚本,它循环遍历文件夹的所有文件并执行(通常是持久的)命令。基本上是

for file in ./folder/*;
do
    ./bin/myProgram $file > ./done/$file
done
Run Code Online (Sandbox Code Playgroud)

(请忽略语法错误,这只是伪代码)。

我现在想同时运行这个脚本两次。显然,如果 ./done/$file 存在,则不需要执行。所以我把脚本改成了

for file in ./folder/*;
do
    [ -f ./done/$file ] || ./bin/myProgram $file >./done/$file
done
Run Code Online (Sandbox Code Playgroud)

所以基本上问题是:两个脚本(或通常不止一个脚本)是否可能实际上处于同一点并检查done失败且命令运行两次的文件是否存在?

这将是完美的,但我非常怀疑。这太容易了 :D 如果他们处理同一个文件可能发生,是否有可能以某种方式“同步”脚本?

scripting shell-script parallelism

8
推荐指数
1
解决办法
9156
查看次数