如何加快bash随机名称的产生?

时间:2019-04-22 14:54:54

标签: database bash postgresql performance

我的代码性能有问题。运行非常缓慢。我需要为我的postgres数据库生成数以百万计的随机人员,然后将其插入数据库。人员具有参数名称,出生日期,性别,年龄。我创建了名字和姓氏列表,以便从中随机选择名字。有人能帮我吗? 这是我的代码:

#docker params
name="`docker ps | rev | cut -d " " -f1 | rev | grep -v NAMES`"
dbs_name="DBS_projekt"

#load names from files
firstName=(`cat generatorSource/firstNames.txt`)
firstNameCount="`wc -l generatorSource/firstNames.txt | tr -s ' ' | cut -d ' ' -f2`"
secondName=(`cat generatorSource/lastNames.txt`)
secondNameCount="`wc -l generatorSource/lastNames.txt| tr -s ' '  | cut -d ' ' -f2`"

#gender array
gender=("Male" "Female" "Other")

#actual date
now=$(date | rev | cut -d " " -f1 | rev)
array=()

for ((x = 1; x <= 1000;x++))
do
 array+="INSERT INTO persons(name,birthdate,gender,age) VALUES"
 for (( n=1; n<=1000; n++ ))
 do
    secondrand=$(( ( RANDOM % $secondNameCount )   ))
    firstrand=$(( ( RANDOM % $firstNameCount )   ))
    genderand=$(( ( RANDOM % 3 )   ))
    year=$(( ( RANDOM % 118 ) + 1900  ))
    month=$(((RANDOM % 12) + 1))
    day=$(((RANDOM % 28) + 1))
    age=$(expr $now - $year)
    if [ $n -eq 1000 ]; then
           array+="('${firstName[$firstrand]} 
           ${secondName[$secondrand]}','$year-$month-$day', 
           '${gender[$genderand]}','$age');"
        else
           array+="('${firstName[$firstrand]} 
           ${secondName[$secondrand]}','$year-$month-$day', 
          '${gender[$genderand]}','$age'),"
        fi
 done

done

#run psql in docker and run insert commands
docker exec -i $name psql -U postgres << EOF
\c $dbs_name

$array

EOF

1 个答案:

答案 0 :(得分:0)

请注意,您将“数组”声明为一个数组,但是您将其使用用作字符串。

array=()
...
 array+="INSERT INTO persons(name,birthdate,gender,age) VALUES"

正在发生的事情:

$ array=()
$ declare -p array
declare -a array='()'
$ array+="first"
$ array+="second"
$ declare -p array
declare -a array='([0]="firstsecond")'

要将元素插入数组,必须使用括号:

$ array=()
$ array+=("first")
$ array+=("second")
$ declare -p array
declare -a array='([0]="first" [1]="second")'

我怀疑这可能是缓慢的原因之一:您正在构造一个巨大的字符串。如图所示添加括号,然后将docker调用更改为

IFS=$'\n'
docker exec -i $name psql -U postgres << EOF
\c $dbs_name

${array[*]}
EOF