요구 사항은 다음과 같습니다파일에 기록을 비교 및보고 통계 - 시나리오 1
사실 1 : 우리는 레거시 시스템에 의해 생산 된 일부 데이터 파일이
사실 2 : 우리는 새로운 생산 일부 데이터 파일이 결국 기존 하나
사실을 교체해야 시스템은 3 :
- 두 파일은 텍스트/ASCII 파일, 레코드 는 0,123,516으로 구성되고있다여러 줄.
- 레코드의 각 줄은 의 필드 이름과 필드 값으로 구성됩니다. 선이 제시되는
- 형식은 1 2하지만 필드 명 및 fieldValue의 는
- 필드 이름 1 (2) 사이에 변경 정규식의 사용을 통해 각 라인 로부터 추출 될 수 있지만, 사이 다르다 그들에게
- 각 레코드는 두 시스템에서 동일하지 않을 을 필요로 우리가 출력 파일에 기록 주문으로 새 레코드와 기존 기록을 관련하는 데 도움이되는 고유 식별자 을 가지고에 관한 것을 우리는 매핑이있다. 우리는 새로운 시스템을 구축하지만 반복 때, 우리가 비교해야로서 : 35 MB
사실 4-
사실 5 :이 비교 작업은 값 비싼 시각적 diff 도구를 사용하여 수동으로 수행됩니다. 이를 돕기 위해 두 개의 다른 필드 이름을 공통 이름으로 가져온 다음 각 파일의 각 레코드에서 필드 이름을 정렬하여 순서대로 동기화하는 도구를 작성했습니다 (새 파일에는 무시되는 추가 필드가있을 수 있음). 시각적 차이)
사실 6 : 사람이 수동으로 비교를 수행하고 인간이 실수를 저지르기 때문에 우리는 우리의 타임 라인에 중대한 영향을 미치는 잘못된 posetives와 네거티브를 얻고 있습니다.
물론 'ALG'와 'DS'는 무엇이되어야합니까?
내가 해결해야하는 시나리오 :
사람들이 시각은 diff를 검사하기 위해 계속- 대부분의 처리는 라인의 배열을 정렬 것 같다 -이에서 exsiting 스크립트의 성능이 음침한 lexicographic order (배열 요소를 읽고/가져 오는 것 : Tie :: File :: FETCH, Tie :: File :: Cache :: lookup 그리고 그것을 올바른 위치에 두는 것은 Tie :: File :: Cache :: insert, 타이 :: 파일 :: 힙 :: 삽입)
use strict;
use warnings;
use Tie::File;
use Data::Dumper;
use Digest::MD5 qw(md5_hex);
# open an existing file in read-only mode
use Fcntl 'O_RDONLY';
die "Usage: $0 <unsorted input filename> <sorted output filename>" if ($#ARGV < 1);
our $recordsWrittenCount = 0;
our $fieldsSorted = 0;
our @array;
tie @array, 'Tie::File', $ARGV[0], memory => 50_000_000, mode => O_RDONLY or die "Cannot open $ARGV[0]: $!";
open(OUTFILE, ">" . $ARGV[1]) or die "Cannot open $ARGV[1]: $!";
our @tempRecordStorage =();
our $dx = 0;
# Now read in the EL6 file
our $numberOfLines = @array; # accessing @array in a loop might be expensive as it is tied??
for($dx = 0; $dx < $numberOfLines; ++$dx)
{
if($array[$dx] eq 'RECORD')
{
++$recordsWrittenCount;
my $endOfRecord = $dx;
until($array[++$endOfRecord] eq '.')
{
push @tempRecordStorage, $array[$endOfRecord];
++$fieldsSorted;
}
print OUTFILE "RECORD\n";
local $, = "\n";
print OUTFILE sort @tempRecordStorage;
@tempRecordStorage =();
print OUTFILE "\n.\n"; # PERL does not postfix trailing separator after the last array element, so we need to do this ourselves)
$dx = $endOfRecord;
}
}
close(OUTFILE);
# Display results to user
print "\n[*] Done: " . $fieldsSorted . " fields sorted from " . $recordsWrittenCount . " records written.\n";
그래서 나는 그것에 대해 생각하고 내가 생각하는 트라이, 어쩌면 접미사 트라이/PATRICIA의 트라이 경우, 삽입 itsel에 그래서 어떤 종류의 f 각 레코드의 필드가 정렬됩니다. 따라서 최종 배열을 모두 한 번에 정렬 할 필요가 없으며 비용이 상각됩니다 (내 부분에 대한 추론)
또 다른 문제가 발생합니다. Tie :: File은 배열을 사용하여 행을 추상화합니다. 트리에 줄을 읽고 배열로 다시 직렬화하는 파일은 추가 메모리와 처리가 필요합니다./
질문 - 묶인 배열을 정렬하는 데 드는 비용보다 많은 비용이 들지 않습니까?