고정 길이 레코드 파일을 구문 분석하는 Perl로 작성된 구문 분석기가 있습니다. 레코드의 일부는 숫자로만 구성된 여러 문자열 (고정 길이도 포함)로 구성됩니다. 문자열의 각 문자는 ASCII char이 아닌 숫자로 인코딩됩니다. 즉, 문자열 12345가있는 경우 01 02 03 04 05 (31 32 33 34 35 대신)로 인코딩됩니다.Perl에서 조인과 결합 된 압축 해제 성능
언팩으로 레코드를 구문 분석하고이 특정 파트는 @array = unpack "C44", $s
으로 압축을 풉니 다. 그런 다음 $m = join("", @array)
처럼 간단한 조인으로 필요한 문자열을 복구합니다.
디코딩 할 최적의 방법인지 궁금합니다. 파일은 상당히 크고 수백만 개의 레코드가 있습니다. 분명히 최적화가 가능한지 살펴 보았습니다. 프로필러는 대부분의 시간이 레코드 구문 분석에 소비된다는 것을 보여줍니다 (예 : 읽기, 쓰기 및 기타 문제는 문제가되지 않음). 대부분의 시간을 구문 분석하는 데 이러한 조인이 사용되었습니다. 다른 소스에서 조인은 매우 효율적인 작업임을 기억합니다. 코드의 속도를 높이는 것이 가능한지 또는 이미 최적인지 여부에 대한 아이디어가 있습니까? 예를 들어 pack/unpack 조합을 사용하는 등 영리한 방법으로이 중간 배열을 피하는 것이 가능할까요?
편집 : 코드 예제
이 같은 모습을 최적화하기 위해 노력 코드 : 언제나처럼 펄
while (read(READ, $buf, $rec_l) == $rec_l) {
my @s = unpack "A24 C44 H8", $buf;
my $msisdn = substr $s[0], 0, 11;
my $address = join("", @s[4..14]);
my $imsi = join("", @s[25..39]);
my $ts = localtime(hex($s[45]));
}
질문에 더 많은 코드가 추가되었습니다. – MariusM