2013-10-26 7 views
1

У меня есть большой текстовый файл около 4 ГБ и более 8 миллионов строк, я пишу скрипт perl для чтения этого файла по строкам, выполняю некоторую обработку и обновляю информацию до sybase, я сделал это в пакетном режиме, 1000 строк за пакет для фиксации обновлений, но при этом возникает проблема: сначала пакет стоит всего от 10 до 20 секунд, но при обработке идет процесс обновления партии медленнее и медленнее, партия стоит от 3 до 4 минут, я определенно не знаю, почему это происходит! Любое тело может помочь мне проанализировать это, что может быть причиной? Спасибо заранее, на моем колене ...Обновление sybase медленнее и медленнее

ответ

0

==> Я пишу скрипт на языке Perl, чтобы прочитать этот файл построчно, сделать некоторую обработку и обновлять информацию в SyBase

Пожалуйста делать целую обработку за один раз, обрабатывать ваш исходный файл за один раз; Подготовьте структуру данных с помощью хэша, массива согласно требованию, а затем начните вставлять данные в базу данных.

Пожалуйста, держать ниже точки в виду при вставке больших объемов данных в базу данных.

1 Если данные столбцов не слишком велики, вы также можете вставлять целые данные за один раз (вам может потребоваться хорошая ОЗУ, не уверенная в размере, поскольку она зависит от набора данных, который вам нужно обработать).

2- Вы должны использовать execute_array perl DBI, чтобы вы могли вставлять данные за один раз.

3- Если у вас недостаточно памяти для вставки данных за один раз, пожалуйста, разделите свои данные (может быть в 8 частях, 1 миллион строк каждый раз).

4- Также убедитесь, что вы готовите заявление один раз. В каждом запуске вы просто выполняете новый набор данных.

5- Установите свой авто_коммит.

Образец кода для использования execute_array perl DBI. Я использовал это, чтобы вставить около 10 миллионов данных в mysql.

Сохраните данные ur в массивах, как показано ниже, в виде массива. @ column1_data, @ column2_data, @ column3_data

print $logfile_handle, "Total records to insert--".scalar(@column1_data); 
    print $logfile_handle, "Inserting data into database"; 
    my $sth = $$dbh_ref->prepare("INSERT INTO $tablename (column1,column2,column3) VALUES (?,?,?)") 
       or print ($logfile_handle, "ERROR- Couldn't prepare statement: " . $$dbh_ref->errsr) && exit; 
    my $tuples = $sth->execute_array(
       { ArrayTupleStatus => \my @tuple_status }, 
       \@column1_data, 
       \@column2_data, 
       \@column3_data 
       ); 

$$dbh_ref->do("commit"); 
    print ($logfile_handle,"Data Insertion Completed."); 
    if ($tuples) { 
     print ($logfile_handle,"Successfully inserted $tuples records\n"); 
    } else { 
    ##print Error log or those linese which are not inserted 
     my $status = $tuple_status[$tuple]; 
      $status = [0, "Skipped"] unless defined $status; 
      next unless ref $status; 
      print ($logfile_handle, "ERROR- Failed to insert (%s,%s,%s): %s\n", 
         $column1_data[$tuple], $column2_data[$tuple],$column3_data[$tuple], $status->[1]); 
     } 
    } 
+0

благодарит за ваш ответ! – user2922670

Смежные вопросы