2013-10-26 5 views
1

큰 텍스트 파일이 4GB, 800 만 라인 이상 있습니다.이 파일을 한 행씩 읽고, 일부 처리하고 sybase에 정보를 업데이트하는 perl 스크립트를 작성하고 있습니다. 내가 배치 방식으로, 업데이트 커밋을 위해 배치 당 1000 라인을했는데, 여기에 문제가 생겼다. 처음에는 배치가 10 ~ 20 초 밖에 들지 않지만, 처리가 진행되면 배치 업데이트가 느려지고 느려진다. 3 ~ 4 분의 비용이 소요됩니다. 왜 이런 일이 벌어지고 있는지 전혀 알 수 없습니다! 어떤 몸이라도 분석가가 원인이 될 수있는 것을 도울 수 있습니까? 내 무릎에 사전에 감사 ...sybase 업데이트 속도가 느려지고 느려집니다.

답변

0

==> 나는

을 SYBASE하기 위해 정보를하시기 바랍니다, 라인별로이 파일 라인을 읽을 일부 처리를하고 업데이트하는 펄 스크립트를 쓰고 있어요 한 번에 전체 처리를 수행하면 한 번에 소스 파일을 처리 할 수 ​​있습니다. 요구 사항에 따라 해시, 배열을 사용하여 데이터 구조를 준비한 다음 데이터베이스에 데이터를 삽입하기 시작합니다. 데이터베이스에 대용량 데이터를 삽입하는 동안

염두에 포인트 아래에 보관하십시오.

1- 각 열 데이터가 너무 크지 않으면 전체 데이터를 한 번에 삽입 할 수 있습니다. 처리해야하는 데이터 집합에 따라 크기가 다른 RAM이 필요할 수 있습니다.

2 한 번에 데이터를 삽입 할 수 있도록 perl DBI의 execute_array를 사용해야합니다.

3- 데이터를 삽입하기에 충분한 RAM이없는 경우 데이터를 삭제하십시오 (매회 8 줄, 1 백만 줄 수 있음).

4- 또한 문장을 한 번 준비해야합니다. 모든 작업에서 새로운 데이터 세트로 실행 중입니다.

5- auto_commit을 해제하십시오.

perl DBI의 execute_array를 사용하는 샘플 코드. 나는 mysql에 약 1 천만 개의 데이터를 삽입하기 위해 이것을 사용했다.

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

관련 문제