2004년 5월 8일 토요일

Massive data store and load

File과 DB
File이 더 유용한 경우 - sequential access(단순 bulk read, write)
DB가 더 유용한 경우 - random access(insert, delete, search)

Data의 type
ascii form - 보기에 편하다. vi, sed, awk 등 text 기반 tool로 변환이 가능하다.
binary form - 보기에 불편하다. 전용툴을 써야하고 그 툴을 모두 내가 개발해야 한다.

숫자 data의 type
ascii form - 보기에 편하다. parsing과 atof, atoi 등의 function을 call해야 하는 cost가 있다.
binary form - 보기에 불편약간 불편할 수도 있으나. parsing이 필요없고 변환 function을 call할
                   필요도 없다.

예를 들어 integer라면
IA32 Architecture, Linux 2.4의 gcc에서 int의 크기는 4byte이다.
sizof(int) = 4 , 표현 범위 : -20억 ~ 20억

따라서 binary form에서는 정수 1개 당 4byte가 필요하다.
반면 ascii form에서는 정수 1개 당 10byte (10억이므로 자릿수가 10개) + 1byte (delimiter)
= 11byte가 필요하다. (물론 0을 padding해서 10byte로 만들 수도 있다.)
약 2.5배 이상의 공간이 필요하고 I/O에 또 그만큼의 시간이 소요된다.
variable length encoding은 또한 속도를 더 느리게 한다.
memory allocation양을 추정할 수 없게 한다.

속도 향상을 위한 방법
dynamic allocation보다는 static allocation을 쓰도록 해야 한다.
한 번 할당한 메모리를 application level에서 재활용할 필요가 있다.
Memory Pool을 이용할 수도 있으나 그것을 user의 편의를 위한 것이다.
Berkeley DB는 B+ tree이기 때문에 sort된 data를 넣어야 수행시간이 빨라진다.

댓글 없음:

댓글 쓰기