'계산': 검색된 포스트 '2'건
- 2008/08/21 엑셀 계산 속도 (2)
- 2005/12/03 게임내 딜레이의 영향력 계산하기. (4)
엑셀 2007을 처음 구경한 것이 언제인가 하고 찾아보니 어느새 2년 하고도 석달 전입니다. 인터페이스를 포함해서 여러 가지 사항들이 변경되는 것을 파악했지만, 실제로 2년이 지나도록 주력으로 사용할 일이 없었습니다. 새로운 인터페이스에 적응하기 귀찮아서가 가장 큰 이유였고, 어째서인지 엑셀 2007을 사용하려고 할 때마다 체감 속도가 엑셀 2003에 비해 상당히 느리다고 생각되었기 때문에, 올해까지도 굳이 사용하려고 노력하지 않았습니다. 더 이상 엑셀 2003으로 처리할 수 없는 커다란 데이터를 만나기 전까지는요.
하지만 기어이 만나고야 말았습니다. 최대 열 수가 65,536개인 엑셀 2003에서 여러 워크시트로 데이터를 나눠 어떻게든 처리해 보려는 시도를 하기 부끄러울 정도로 기나긴 열을 자랑하는 이 데이터는 인터페이스에 적응하는 것이 귀찮아 주섬주섬 피하던 엑셀 2007을 어떻게든 써먹지 않으면 안 되겠다는 결정을 내리도록 만들었습니다.
이 데이터는 뭘 하든 골칫거리였는데, 여닫는데만도 한참씩 걸렸고, 열 단위로 뭘 하려고 마음먹으면 그게 뭐든지 간에 한 80만 번씩 반복해야 하는 것이 가장 큰 문제였습니다. 특히 이 데이터는 하나의 열이 한 가지 값을 의미하는 형식으로 만들어져 모든 계산은 다른 열을 참조하게 되어 있었고, 그 참조는 다시 80만개의 셀 중 어느 셀을 참조할지를 찾아야 하는 일이 일어났습니다. 당연히 엑셀은 뭐 하나 건드리면 몇 분씩 얼어버렸고, 처리에 집중할 수가 없었습니다.
엑셀 계산 속도를 향상시키는 여러 가지 방법을 찾아봤는데, 당장 시도해볼 수 있는 것들은 최소한 엑셀이 계산을 위해 하염 없이 굳어버리는 상황을 사전에 예측이나마 할 수 있게 만들어 주었습니다. 적어도, 엑셀이 굳고 나면 가서 잠깐 자고 올지, 아니면 커피를 한 잔 타서 마시고 올지, 화장실에 다녀올지, 은행에 다녀올지를 결정할 수 있습니다.
일단, 같은 계산 결과를 여러 곳에서 사용한다면 저처럼 멍청하게 - ㅜ_ㅜ - 결과를 필요로 하는 모든 셀에 수식을 집어넣지 말고 독립된 셀에 계산을 한 다음, 그 셀을 참조하도록 만들면 계산을 한 번만 할 수 있습니다. 제가 사용했던 수식은 < 그 열에서 값을 가져와라 (어느 열인지 찾아서) > 였는데, 저 '어느 열인지 찾아서' 부분이 80만열 중 하나를 찾는 계산을 했습니다. 이걸 여러 셀에 붙여넣고 보니 시시각각 얼어붙는 엑셀 앞에서 뜨거운 콧바람을 토해낼 수밖에 없었지요. < 그 열에서 값을 가져와라 (이미 찾아둔 열 위치) > 같은 식으로 표현하면 엑셀이 얼어붙은 동안 은행에 가는 대신 화장실에 다녀오는 정도로 끝낼 수 있습니다.
두번째로 덕을 본 건, 범위 내에서 검색을 하는 경우, 미리 다른 계산을 통해 범위를 줄여 주면 큰 도움이 된다는 것입니다. 언듯 생각했을 때는 범위를 지정하기 위해 사전에 수행하는 계산이 그냥 80만 열을 검색하는 것보다 더 느릴 거라고 생각했고 실제로도 그랬지만, '80만 열을 검색하는 것'을 '80만번' 수행하려고 보니 미리 계산을 해서 '80만 열'을 한 '2000열' 정도로 줄이는 것이 큰 도움이 되었습니다.
세번째로 시도한 것은 상대적으로 더 느린 내장 함수를 좀 더 빠른 내장 함수 형식으로 고치는 것이었습니다. 사실, 더 느린줄 알면서도 그 함수를 쓰는 이유는 그 함수가 더 편하기 때문인데, 대표적으로 'VLOOKUP' 같은 것이 그렇습니다. 이 함수는 'MATCH'와 'INDEX'의 조합으로 고칠 수 있는데, 후자가 조금 더 빠르고, 이걸 수십만번 반복하다 보면 더 큰 차이가 납니다. 하지만 셀을 수정하는데는 훨씬 더 귀찮아집니다.
마지막으로, 최대한 데이터를 필터링 하지 않습니다. 처음에는 필터링한 결과에만 수식을 추가해 계산 횟수를 줄이려고 했는데, 열이 아주 많고, 필터링한 결과의 연속되지 않는 범위 수가 2048개보다 많으면 수식을 아래 셀에 연속해서 붙여넣을 수 없게 됩니다. 아마 '범위가 너무 복잡하다'는 메시지가 나올 겁니다. 그래서, 수식을 필터링 하지 않은 모든 셀에 붙여넣되 'IF()'로 감싸서 필터링에 나오지 않을 조건이면 계산을 수행하지 않는 식으로 해서 엑셀이 얼어붙은 동안 화장실에 다녀오는 대신 기지개를 한 번 펴고 주변을 서성이는 정도로 끝낼 수 있게 되었습니다.
... 적어놓고 보니 프로그램 동네에서는 본능적으로 당연하게 생각할 만한 것들 뿐인데, 괜히 최신 프로세서와 널럴한 메모리만 믿고 깝치다가 완전 바보됐습니다. 위에 이야기한 링크에는 계산을 빠르게 하기 위한 여러 가지 팁들이 널려 있는데, 그 중에는 프로세서나 메모리를 업그레이드 하는 아주 소극적인 방법부터 편의를 위해 여러 기능을 포함하는 대신 느리게 만들어진 내장 함수를 대체해 버리는 적극적인 방법도 있습니다. 기회가 되면 시도해 보는 것도 신나겠습니다.

짤방: 처음 골렘을 본 날.