2015-01-12 2 views
0

동적 레코드 길이 이진 파일을 읽으려고합니다.perl 스크립트의 성능

field1field2field3field4vector1vector2 

지금 FIELD3 전직 FIELD3위한

은 & 2 본 것 vector1 후, 2 벡터의 선두로부터 정의 및 값이 3이면 & 3 vector1,2 것 아래 같은 데이터를 갖는다 선물.

나는 아래 코드를 작성했지만 잘 작동하지만 매우 나쁜 성능을 제공합니다.

는 field1-4 고정라고하자 길이는 2,652이며, 각 벡터의 길이는 301 FIELD3 내가 펄에 새로운 오전으로 2396

my $string; 
my $rep_factor; 
my $size; 

open (FILE, $ARGV[0]) or die $!; 
my $re = 2396; 
my $rec = 0; 
while (<FILE>) { 
    seek(FILE,$re,0); 
    read(FILE,$rep_factor,2); 
    my $rep_fact = undefined2defined(convert2ascii_decimal($rep_factor,0)); 
    $size = ($rep_fact * 301) + 2652; 
    seek(FILE,$rec,0); 
    read FILE,$string,$size; 

    filewrite ($ARGV[1], recordparse($string)); 
    $rec = $size + $rec; 
    $re = $size + 2396; 
} 

코드와 함께 도와주세요 위치에서 3 바이트이다 , 그리고 여기에 아무것도 생각할 수 없었다. 는 입력 레코드 분리의 값 (\n-$/ 보통 기본값) 또는 EOF를 발견 할 때까지

덕분에, 인 Ashish는

+0

경우, [코드 검토 (하지를 HTTP : //codereview.stackexchange.com/)이 질문을 할 수있는 적절한 곳입니까? – Reti43

+1

'언팩 '을 본 적이 있습니까? –

+2

바이너리 형식을 읽으려면 [pack] (http://p3rl.org/pack)과 [unpack] (http://p3rl.org/unpack)이 보통 사용됩니다.'/'템플릿 문자를 확인하십시오. – choroba

답변

0

while (<FILE>)$_로 파일을 읽습니다. 그런 다음 $_의 데이터로 작업하는 대신 $re으로 돌아가서 다시 읽으십시오. 마지막으로 블록이 끝나고 루프는 입력 레코드 분리 자 또는 EOF를 찾을 때까지 파일 핸들의 현재 위치에서 읽는 <FILE>으로 다시 테스트됩니다.

당신은이 같은 루프 개혁 경우 반복이 모든 읽기 방지 할 수 있습니다 코드가 의도 한대로 작동하지만 성능을 향상시키고 자하는

do { 
    seek(FILE,$re,0); 
    read(FILE,$rep_factor,2); 
    my $rep_fact = undefined2defined(convert2ascii_decimal($rep_factor,0)); 
    $size = ($rep_fact * 301) + 2652; 
    seek(FILE,$rec,0); 
    read FILE,$string,$size; 

    filewrite ($ARGV[1], recordparse($string)); 
    $rec = $size + $rec; 
    $re = $size + 2396; 
} until eof(FILE); 
관련 문제