엑셀의 구현

Excel의 경우 row가 6만 col이 255개의 정보를 갖기때문에 이 수많은 데이타를 관리하는데 좀더 깔삼한 방법이 필요하다.

첫번째로 하나의 Cell에 정보를 처리하는 방법을 소개하자면 다양한 데이타를 처리할수 있는 Excel 의 모든 각각의 Cell 의 정보는 8바이트로 들어간다고 한다. 여기서 첫번째 4바이트는 데이타타입이나 Cell의 외적인 부분에 대한정보(Cell 디자인) 등을 담고 있고. 뒤이 4바이트가 실제로 정보를 저장한다고 하는데…

우선 정수형 -> 4바이트, float 형 -> 4바이트, 문자열 -> 포인터처리(4바이트) 정도로 처리한다 그런데 double 형의 경우 8바이트 값이다. 이것을 어떻게 처리하냐! 우선 문자열의 경우처럼 다른 데이타스토어에 저장하고 그 인덱스값을 같는것이 한 방법이 될수 있다. 이것이 excel에서 double 형을 처리하는 최악의 방법이라고 한다.

double형의 경우는 먼저 float 형으로 캐스팅을 해봐서 두 값이 같으면 float 데이타 타입을 바꿔서 저장한다고 한다. 그런데 여기서 끝나는 것이 아니다. float의 경우는 그 데이타에 100을 곱해봐서 정수가 되면 그 정수값으로 저장하는 방식을 취한다고 한다.(물론 100을 곱했다는 정보는 따로 관리할것이다.)

즉 Excel 에서 사용되는 데이타들은 많은 경우 소수점 2자리까지의 데이타를 사용할 가능성이 높다는 것을 적용한 것이다.

두번째 그럼 Cell들의 정보는 어떻게 관리할것인가 아까도 말했지만 대략 총 Cell 의 개수는 (0xffff)*255 이라고 한다. 이것들에 대한 포인터 정보만을 가지고 있는것도 엄청난 메모리를 차지할것이다. 그럼 링크드 리스트? 이 수많은 데이타를 억세스하기에는 속도가 너무 느리다.

Excel은 데이타들이 사각형의 매트릭스 형태로 모여있을 가능성이 높다! 라는 가정하에 사각형의 덩어리 단위로 관리를 한다고 한다. 즉 어디부터 시작해서 가로,새로 몇개의 데이타가 있다. 라는 식이며 이 사각형 덩어리의 경우는 빠른 엑세스를 위해서 어레이로 관리된다고 한다.

세번째는 수식에 관련된것인데 엑셀은 C셀의 값은 A셀*B셀의 값 이라는 식으로 정의가 가능하다. 그래서 A,B의 값이 바뀌면 C셀의 값도 바뀌는 것이다. 이 경우 간단하게 생각하면 A와 B에게 어떤 셀이 너를 참조하고 있다는 정보를 저장하고 바뀌었을 경우 그 셀의 정보도 갱신한다. 라는 식으로 구현이 가능할텐데 이렇게 할 경우 여기저기서 참조가 되고 있는 경우 이 정보를 검색하고 갱신하는데도 오버헤드가 상당할것이다. 그래서 엑셀에서는 2비트의 정보를 이용해서 00 일때는 참조없음, 01 일때는 자기와 같은 row에서 참조하고 있음 ,10 일때는 자신과 같은 col에서 참조하고 있음, 11은 어디선가 참조하고 있음. 의 정보를 이용해서 좀더 속도를 올린다고 한다.

위의 세가지 방법 모두 엑셀에서는 이런 형식의 데이타가 들어온다. 이런식으로 데이타를 사용한다는 식의 통계학점인 관점이 들어가는 것이다.

이 이야기는 몇일전 집에가는 길에 소장님이 해주셨는데 꽤 재미있는 이야기 였다.

예전에 날아가버린 홈피에 썼었던글.
정어리 홈피에 스크랩된게 있길래 다시 퍼옴.

“엑셀의 구현”에 대한 2개의 댓글

  1. MSSQL의 한 컬럼이 들고 있을 수 있는 데이터의 량은 8K가 한계..그럼에도 불구하고 몇 메가짜리 파일도 마구 들어가는 그것이 포인터 개념.(…최신 버전에선 바뀌었을지도?!)

    기회 되면 MSSQL ADMIN 과정 같은거(MS교육센터 5일짜리)도 들어라.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다