'엑셀': 검색된 포스트 '9'건
- 2008/08/27 Big Grid
- 2008/08/21 엑셀 계산 속도 (2)
- 2007/06/04 사용자 정의 함수.
- 2007/04/05 엑셀에서 간편하게 사용할 수 있는 평활화 함수.
- 2007/03/22 엑셀 파이프.
엑셀 2007은 이전 버전에 비해 인터페이스 말고도 여러 부분의 개선이 이루어졌습니다. 사실, 기능만으로 따진다면 이전 버전과 크게 달라진 것이 별로 없다고 볼 수도 있습니다. 하지만 내부적으로 여러 가지 제약사항들이 완화되어 이전 버전의 제한 영역에서 생기던 오동작이 많이 줄어들었습니다.
하지만 엑셀의 제한이 완화되었다고 해서 데이터 크기가 커지는 속도가 완화된 것은 아닙니다. 물론, 엑셀 2007의 모든 셀을 가득 채울만한 거대한 데이터는 엑셀 대신 다른 처리 방법을 고안하는 것이 맞지만, 엑셀만큼 편리한 데이터 처리 도구가 많지 않습니다.
엑셀 2007은 분명 (2^14) * (2^20) 크기의 커다란 스프레드시트 전체에 데이터를 넣어도 제대로 동작해야 합니다. 물론, 모든 셀에 데이터를 넣는다고 해서 즉시 제한 영역에서 일어나는 오동작이 일어나지는 않지만, 다른 세부 제한 때문에 엑셀 2007에서 기존 엑셀 2003에서 사용하는 것보다 아주 큰 데이터를 처리하는데 엑셀을 완전히 신뢰할 수 없습니다.
대부분의 문제는 이전 버전에서 개수로 제한을 두던 사항들이 엑셀 2007에서 개수 제한 대신 메모리 한계만큼 가능하도록 제한을 푼 것에서 일어납니다. 엑셀은 계산 속도 단축을 위해 무조건 잔체 셀을 계산하지 않습니다. 그래서 워크시트에 아주 많은 계산들이 엉켜있어도 쉽사리 느려지지 않는데요, 약 8000개 정도의 다른 셀을 참조하는 계산을 계산하지 않은 상태로 유지할 수 있습니다. 처리하지 않은 계산이 제한을 넘으면 그때서야 엑셀이 잠깐 얼어붙어 전체 계산을 수행합니다.
그런데, 엑셀 2007에서는 이런 제한들이 '메모리가 허락하는 만큼'으로 변경되었습니다. 메모리를 많이 꽂으면 꽂을수록 계산을 나눠서 할 수 있으니 더 빠르다고 생각할 수 있지만, 오히려 처리되지 않은 계산이 늘어나면 셀을 참조하는 과정에서 오동작이 생깁니다. 수식이 들어있는 셀을 새로 고치면 이 셀에 종속된 모든 셀의 계산을 처리해야 하고, 종속된 셀을 처리하는 과정에서 이 셀을 복사해서 만든 다른 셀의 계산도 수행하는 것이 정상이지만, 오동작이 많이 발생합니다. 그래서 가끔씩 워크시트 전체를 수동으로 리빌드 해야 합니다. 처리량이 많다면 엑셀이 한참 얼겠죠.
또, 이전 버전에서 2048개로 제한되어 있던 한번에 복사하거나 붙여넣을 수 있는 필터링 된 셀의 영역 수도 엑셀 2007에서는 '메모리 한계만큼'으로 변경되었는데, 덕분에 이번에도 아주 많은 셀을 옮길 때 문제를 일으킵니다. 필터링 된 상태를 복사했지만 실제로는 필터링 되어 있지 않거나, 필터링 된 데이터의 일부만 복사되거나, 리소스가 부족하다는 에러를 내고 작업이 수행되지 않기도 합니다. 이 상황들이 무작위로 일어나지요.
The Big Grid - 엑셀 2007 - 가 많은 데이터를 처리할 때 일어나는 여러 가지 문제점들이 엑셀 자체의 문제일지, 아니면 엑셀 2007의 워크시트 전체를 사용하려면 이제 32비트 윈도우에서 처리할 수 있는 메모리보다 더 많은 메모리가 필요한 것일지는 잘 모르겠습니다. 하지만, 적어도 32비트 환경과 2기가 정도의 메모리에서는 엑셀 2007이 제시하는 처리 가능한 데이터의 양을 신뢰할 수 없고, 데이터의 처리 결과나 작업 과정도 신뢰할 수 없는 상황이 많았습니다.
엑셀 2007은 분명 엑셀 2003보다 더 많은 데이터를 처리할 수 있도록 만들어졌지만, 아직 아주 큰 데이터를 원활하게 처리할만큼 엑셀 자체가 안정적이지 않고, 그 정도의 데이터를 처리하기 위해서는 32비트 윈도우의 한계에 도달하지 않았나 싶습니다.
2003, 2007, the Big Grid, 엑셀
엑셀 2007을 처음 구경한 것이 언제인가 하고 찾아보니 어느새 2년 하고도 석달 전입니다. 인터페이스를 포함해서 여러 가지 사항들이 변경되는 것을 파악했지만, 실제로 2년이 지나도록 주력으로 사용할 일이 없었습니다. 새로운 인터페이스에 적응하기 귀찮아서가 가장 큰 이유였고, 어째서인지 엑셀 2007을 사용하려고 할 때마다 체감 속도가 엑셀 2003에 비해 상당히 느리다고 생각되었기 때문에, 올해까지도 굳이 사용하려고 노력하지 않았습니다. 더 이상 엑셀 2003으로 처리할 수 없는 커다란 데이터를 만나기 전까지는요.
하지만 기어이 만나고야 말았습니다. 최대 열 수가 65,536개인 엑셀 2003에서 여러 워크시트로 데이터를 나눠 어떻게든 처리해 보려는 시도를 하기 부끄러울 정도로 기나긴 열을 자랑하는 이 데이터는 인터페이스에 적응하는 것이 귀찮아 주섬주섬 피하던 엑셀 2007을 어떻게든 써먹지 않으면 안 되겠다는 결정을 내리도록 만들었습니다.
이 데이터는 뭘 하든 골칫거리였는데, 여닫는데만도 한참씩 걸렸고, 열 단위로 뭘 하려고 마음먹으면 그게 뭐든지 간에 한 80만 번씩 반복해야 하는 것이 가장 큰 문제였습니다. 특히 이 데이터는 하나의 열이 한 가지 값을 의미하는 형식으로 만들어져 모든 계산은 다른 열을 참조하게 되어 있었고, 그 참조는 다시 80만개의 셀 중 어느 셀을 참조할지를 찾아야 하는 일이 일어났습니다. 당연히 엑셀은 뭐 하나 건드리면 몇 분씩 얼어버렸고, 처리에 집중할 수가 없었습니다.
엑셀 계산 속도를 향상시키는 여러 가지 방법을 찾아봤는데, 당장 시도해볼 수 있는 것들은 최소한 엑셀이 계산을 위해 하염 없이 굳어버리는 상황을 사전에 예측이나마 할 수 있게 만들어 주었습니다. 적어도, 엑셀이 굳고 나면 가서 잠깐 자고 올지, 아니면 커피를 한 잔 타서 마시고 올지, 화장실에 다녀올지, 은행에 다녀올지를 결정할 수 있습니다.
일단, 같은 계산 결과를 여러 곳에서 사용한다면 저처럼 멍청하게 - ㅜ_ㅜ - 결과를 필요로 하는 모든 셀에 수식을 집어넣지 말고 독립된 셀에 계산을 한 다음, 그 셀을 참조하도록 만들면 계산을 한 번만 할 수 있습니다. 제가 사용했던 수식은 < 그 열에서 값을 가져와라 (어느 열인지 찾아서) > 였는데, 저 '어느 열인지 찾아서' 부분이 80만열 중 하나를 찾는 계산을 했습니다. 이걸 여러 셀에 붙여넣고 보니 시시각각 얼어붙는 엑셀 앞에서 뜨거운 콧바람을 토해낼 수밖에 없었지요. < 그 열에서 값을 가져와라 (이미 찾아둔 열 위치) > 같은 식으로 표현하면 엑셀이 얼어붙은 동안 은행에 가는 대신 화장실에 다녀오는 정도로 끝낼 수 있습니다.
두번째로 덕을 본 건, 범위 내에서 검색을 하는 경우, 미리 다른 계산을 통해 범위를 줄여 주면 큰 도움이 된다는 것입니다. 언듯 생각했을 때는 범위를 지정하기 위해 사전에 수행하는 계산이 그냥 80만 열을 검색하는 것보다 더 느릴 거라고 생각했고 실제로도 그랬지만, '80만 열을 검색하는 것'을 '80만번' 수행하려고 보니 미리 계산을 해서 '80만 열'을 한 '2000열' 정도로 줄이는 것이 큰 도움이 되었습니다.
세번째로 시도한 것은 상대적으로 더 느린 내장 함수를 좀 더 빠른 내장 함수 형식으로 고치는 것이었습니다. 사실, 더 느린줄 알면서도 그 함수를 쓰는 이유는 그 함수가 더 편하기 때문인데, 대표적으로 'VLOOKUP' 같은 것이 그렇습니다. 이 함수는 'MATCH'와 'INDEX'의 조합으로 고칠 수 있는데, 후자가 조금 더 빠르고, 이걸 수십만번 반복하다 보면 더 큰 차이가 납니다. 하지만 셀을 수정하는데는 훨씬 더 귀찮아집니다.
마지막으로, 최대한 데이터를 필터링 하지 않습니다. 처음에는 필터링한 결과에만 수식을 추가해 계산 횟수를 줄이려고 했는데, 열이 아주 많고, 필터링한 결과의 연속되지 않는 범위 수가 2048개보다 많으면 수식을 아래 셀에 연속해서 붙여넣을 수 없게 됩니다. 아마 '범위가 너무 복잡하다'는 메시지가 나올 겁니다. 그래서, 수식을 필터링 하지 않은 모든 셀에 붙여넣되 'IF()'로 감싸서 필터링에 나오지 않을 조건이면 계산을 수행하지 않는 식으로 해서 엑셀이 얼어붙은 동안 화장실에 다녀오는 대신 기지개를 한 번 펴고 주변을 서성이는 정도로 끝낼 수 있게 되었습니다.
... 적어놓고 보니 프로그램 동네에서는 본능적으로 당연하게 생각할 만한 것들 뿐인데, 괜히 최신 프로세서와 널럴한 메모리만 믿고 깝치다가 완전 바보됐습니다. 위에 이야기한 링크에는 계산을 빠르게 하기 위한 여러 가지 팁들이 널려 있는데, 그 중에는 프로세서나 메모리를 업그레이드 하는 아주 소극적인 방법부터 편의를 위해 여러 기능을 포함하는 대신 느리게 만들어진 내장 함수를 대체해 버리는 적극적인 방법도 있습니다. 기회가 되면 시도해 보는 것도 신나겠습니다.
수치작업을 하면서 꼭 필요한 것 중 하나는 값들의 경향을 알아보는 것입니다. 일정한 곡선을 그리는 값들은 그 자체로 이미 경향을 보인다고 할 수 있습니다. 그래서 별달리 경향을 파악하지 않아도 상관 없습니다. 하지만 때에 따라 들쑥날쑥하게 변하는 값들은 경향을 파악하는 것이 쉽지 않습니다. 유저 캐릭터가 몬스터 NPC를 공격한다고 하면, 최소 대미지와 최대 대미지 사이에서 적당한 분포를 가지고 값을 뽑아냅니다. 이 값들은 분명 어떤 경향을 보이기는 하겠지만, 최소값과 최대값 사이에서 값이 이리 저리 튀기 때문에 이게 높은 건지, 아니면 낮은 건지 파악할 수가 없습니다.
그래서 값을 평활화하는 작업이 필요합니다. 평활화는 위의 대미지 같은 상황처럼, 급격하게 변하는 값의 변화량을 억제해 부드러운 변화를 가지도록 만드는 것을 말합니다. 위에서 유저 캐릭터가 몬스터 NPC를 공격할 때 나오는 대미지 값들은 그 자체로는 경향을 말하기 어렵지마느 평활화 과정을 거치고 나면 '높다' 혹은 '낮다'를 판단할 수 있는 상태가 됩니다.
그런데, 문제는 엑셀에서는 기본적으로 이런 평활화 관련 기능을 제공하지 않는다는 겁니다. 평활화 기능은 당장 필요하고, 만들기는 시간이 부족하고 - 사실은 귀찮고 - 해서 구글씨에게 물어봤더니 꽤 괜찮은 곳을 알려주었습니다. 이곳에서는 평활화 함수를 잘 만들어 제공하고 있는데, 여러 모로 편리하게 사용할 수 있도록 만들어놨습니다.

