我一直在使用普通& 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个内核,我想确保程序在执行时利用所有内核。
谢谢, 阿迪尔
答案 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