Tips in Action‎ > ‎배열과 Hash‎ > ‎

디스크에 들어있는 해쉬

전종필

변수들은 모두 메모리상에 존재합니다. 해쉬 역시 마찬가지이죠.
하지만, 때로, 우리는 해쉬를 디스크상에 올려두고, 다른 프로그램이나, 혹은 같은 프로그램의 다음 실행에서도 사용하고 싶을 수 있습니다.
물론 데이터베이스를 사용할 수도 있지만, 그렇게까지 복잡하게 하고 싶지 않고, 또, 그냥 평범한 해쉬처럼 사용하고 싶습니다.
이럴때는 tie 함수를 DB_File 모듈과 함께 사용합니다.
물론, GDBM_File이나 NDBM_File을 사용할 수도 있지만, 여기서는 설명이 간단한 DB_File 모듈을 사용하겠습니다. 기본적인 원리(혹은 뉘앙스)는 같으니까요.

아래 프로그램을 만들어서 먼저 실행해 보십시오.


# savehash.pl
use DB_File;

$file = 'hashfile.db';

my %hash;

tie %hash, 'DB_File', $file; # 파일로 말하면 open과 비슷한 동작입니다.

%hash = (
	a => 1,
	b => 2,
	c => 3,
	d => 4,
);

untie %hash; # close와 비슷하지요.
tie로 해쉬와 파일을 연결합니다. 파일의 포맷은 DB_File입니다. 그래서 맨 위에는 use DB_File이 들어 갑니다. 해쉬 사용이 끝나면 untie를 해 줍니다.
그리고 다음 프로그램을 만들어서 같은 디렉토리에서 실행해 봅니다.

# read.pl
use DB_File;

$file = 'hashfile.db';

my %hash;

tie %hash, 'DB_File', $file; # open

foreach my $k ( sort keys %hash ) {
	print "$k => $hash{$k}\n";
}

delete $hash{b};
print "After deleting...\n";

foreach my $k ( sort keys %hash ) {
	print "$k => $hash{$k}\n";
}

untie %hash; # close
두 개의 프로그램은 같은 내용의 해쉬에 대해 동작했다는 것을 알 수 있습니다.
tie 함수는 메모리상의 해쉬와 디스크상의 버클리 DB(버전 1)를 연동시켜 줍니다. (물론, 서두에 밝힌 것처럼 꼭 버클리 DB가 아니라도 사용할 수 있습니다.) 디스크상의 데이터를 마치 메모리상에 있는 것처럼 사용하게 해 주는 것이지요.
단순한 데이터라면 굳이 부하가 많이 걸리는 데이터베이스를 사용할 필요없이 위와 같이 tie를 사용하면 됩니다. 
Comments