КШ пакетной обработки - PullRequest
       5

КШ пакетной обработки

1 голос
/ 24 февраля 2011

У меня есть скрипт оболочки, который построчно читает идентификатор пользователя из файла и вставляет записи в базу данных. Однако процесс вставки идет медленно, и я хочу оптимизировать, принимая партии. Я не могу использовать весь файл как один пакет, так как размер транзакции превышает собственные ограничения. Вот скрипт:

for user in `cat $userlist`
do 
echo "processing user $user"
{
    echo "begin"
        i=1
        while [[ $i -le 30 ]] ; do
        echo "insert into usertab values ($user,-1,\"\",-1)" 
        i=$(expr $i + 1)
        done
        echo "commit"
} | propSql userDb -
done

Begin и commit - стандартные ключевые слова для этой базы данных. Здесь, вместо обработки одного пользователя за раз, я хочу обрабатывать 10 пользователей одновременно. Кто-нибудь может предложить необходимые изменения?

1 Ответ

1 голос
/ 24 февраля 2011

Это показывает способ накапливать пользователей 10 одновременно.Вам нужно будет изменить его так, чтобы он соответствовал тому, как вам нужны данные для поиска оператора insert.Я оставил внутренний цикл на месте, но изменил его на цикл for, так как все управление происходит в одном месте.Однако вам может не понадобиться этот цикл.

process () {
   # Somewhere in here you'll use the value of "$@"
   echo "begin"
        # you may not need this loop any more
        for ((i=1; i<30; i++))
        do
            echo "insert into usertab values ($user,-1,\"\",-1)" 
        done
    echo "commit"
}

j=0
while read -r user
do 
    echo "processing user $user"
    if ! (( j++ % 10 ))    # every tenth user, do a database operation
    then
        process "$accum" | propSql userDb -
        accum=""
    fi
    accum+=" $user"    # accumulate user names
done < "$userlist"
process "$accum" | propSql userDb -    # one more time to get the remainder

Обратите внимание, что он написан с использованием синтаксиса ksh93.Если вы используете другую версию, вам нужно будет внести некоторые изменения.

...