--parallel = N未提供所需结果

时间:2015-03-10 07:34:41

标签: unix parallel-processing

我一直在使用普通& amp;进行比较样本数据生成脚本。并行运行。我正在使用GNU库' parallel'用于并行运行脚本。该脚本生成固定列100和100的随机记录。不同的行大小。下面是我生成随机记录的代码段:

for i in $(seq $rows)
do
tr -dc A-Za-z0-9 < /dev/urandom | head -c 2000 > tmp
gawk '$1=$1' FIELDWIDTHS='I put here the varying column lengths' OFS=, tmp >> tmp1
done

以下是我收集的统计数据:

"# of Rows" "# of columns"  "Time took(sec)"    "Time took, using & (sec)"  "Time took Parallelism=4(sec)"
100     100 1   1   ~0
1000    100 6   5   5
10000   100 51  59  51
100000  100 895 576 543
1000000 100 10462   11765   11468

即使我使用&#39; parallel&#39;来引入并行处理。实用程序,与正常处理相比,我没有看到任何经过时间的变化。任何想法,见解,帮助将不胜感激。

我的CPU有4个内核,我想确保程序在执行时利用所有内核。

谢谢, 阿迪尔

2 个答案:

答案 0 :(得分:0)

@Maxim有一个好点。尝试:

cat /dev/urandom | pv > /dev/null

这会给数据足够快吗?如果没有,请尝试安装haveged

/dev/urandom为您提供8位随机数据​​,但您只保留62个值,因此您将丢弃大量值。如果/dev/urandom是瓶颈,那么改进就是使用随机数据的完整值。如果对随机值进行MIME编码,则将使用所有字节,并获得6位值(= 64个不同的值)。

答案 1 :(得分:0)

我发现了错误,你会说 DOH!

您写信给&gt; TMP。因此,如果您并行运行多个作业,您将一次又一次地覆盖此文件。解决方案是跳过tmpfile。这样你就可以匹配/ dev / urandom的速度,然后成为瓶颈:

orig() {
  rows=$1
  for i in $(seq $rows)
  do
  tr -dc A-Za-z0-9 < /dev/urandom | head -c 2000 > tmp
  gawk '$1=$1' FIELDWIDTHS="$(seq 100|xargs)" OFS=, tmp >> tmp1
  done
}

rm tmp1
# Around 200 KB/s
(orig 1000; cat tmp1) | pv | wc -c

pipeversion() {
  rows=$1
  base64 -w 2000 < /dev/urandom | head -n $rows |
    gawk '$1=$1' FIELDWIDTHS="$(seq 100|xargs)" OFS=,;
}

# Around 12 MB/s
pipeversion 1000 | pv | wc -c

export -f pipeversion

# Around 12 MB/s - because /dev/urandom is the bottleneck
seq 100 | parallel pipeversion 1000 | pv | wc -c