'계산': 검색된 포스트 '2'건

  1. 2008/08/21  엑셀 계산 속도 (2)
  2. 2005/12/03  게임내 딜레이의 영향력 계산하기. (4)

엑셀 계산 속도

엑셀 2007을 처음 구경한 것이 언제인가 하고 찾아보니 어느새 2년 하고도 석달 전입니다. 인터페이스를 포함해서 여러 가지 사항들이 변경되는 것을 파악했지만, 실제로 2년이 지나도록 주력으로 사용할 일이 없었습니다. 새로운 인터페이스에 적응하기 귀찮아서가 가장 큰 이유였고, 어째서인지 엑셀 2007을 사용하려고 할 때마다 체감 속도가 엑셀 2003에 비해 상당히 느리다고 생각되었기 때문에, 올해까지도 굳이 사용하려고 노력하지 않았습니다. 더 이상 엑셀 2003으로 처리할 수 없는 커다란 데이터를 만나기 전까지는요.

excel2007

하지만 기어이 만나고야 말았습니다. 최대 열 수가 65,536개인 엑셀 2003에서 여러 워크시트로 데이터를 나눠 어떻게든 처리해 보려는 시도를 하기 부끄러울 정도로 기나긴 열을 자랑하는 이 데이터는 인터페이스에 적응하는 것이 귀찮아 주섬주섬 피하던 엑셀 2007을 어떻게든 써먹지 않으면 안 되겠다는 결정을 내리도록 만들었습니다.

이 데이터는 뭘 하든 골칫거리였는데, 여닫는데만도 한참씩 걸렸고, 열 단위로 뭘 하려고 마음먹으면 그게 뭐든지 간에 한 80만 번씩 반복해야 하는 것이 가장 큰 문제였습니다. 특히 이 데이터는 하나의 열이 한 가지 값을 의미하는 형식으로 만들어져 모든 계산은 다른 열을 참조하게 되어 있었고, 그 참조는 다시 80만개의 셀 중 어느 셀을 참조할지를 찾아야 하는 일이 일어났습니다. 당연히 엑셀은 뭐 하나 건드리면 몇 분씩 얼어버렸고, 처리에 집중할 수가 없었습니다.

엑셀 계산 속도를 향상시키는 여러 가지 방법을 찾아봤는데, 당장 시도해볼 수 있는 것들은 최소한 엑셀이 계산을 위해 하염 없이 굳어버리는 상황을 사전에 예측이나마 할 수 있게 만들어 주었습니다. 적어도, 엑셀이 굳고 나면 가서 잠깐 자고 올지, 아니면 커피를 한 잔 타서 마시고 올지, 화장실에 다녀올지, 은행에 다녀올지를 결정할 수 있습니다.

일단, 같은 계산 결과를 여러 곳에서 사용한다면 저처럼 멍청하게 - ㅜ_ㅜ - 결과를 필요로 하는 모든 셀에 수식을 집어넣지 말고 독립된 셀에 계산을 한 다음, 그 셀을 참조하도록 만들면 계산을 한 번만 할 수 있습니다. 제가 사용했던 수식은 < 그 열에서 값을 가져와라 (어느 열인지 찾아서) > 였는데, 저 '어느 열인지 찾아서' 부분이 80만열 중 하나를 찾는 계산을 했습니다. 이걸 여러 셀에 붙여넣고 보니 시시각각 얼어붙는 엑셀 앞에서 뜨거운 콧바람을 토해낼 수밖에 없었지요. < 그 열에서 값을 가져와라 (이미 찾아둔 열 위치) > 같은 식으로 표현하면 엑셀이 얼어붙은 동안 은행에 가는 대신 화장실에 다녀오는 정도로 끝낼 수 있습니다.

두번째로 덕을 본 건, 범위 내에서 검색을 하는 경우, 미리 다른 계산을 통해 범위를 줄여 주면 큰 도움이 된다는 것입니다. 언듯 생각했을 때는 범위를 지정하기 위해 사전에 수행하는 계산이 그냥 80만 열을 검색하는 것보다 더 느릴 거라고 생각했고 실제로도 그랬지만, '80만 열을 검색하는 것'을 '80만번' 수행하려고 보니 미리 계산을 해서 '80만 열'을 한 '2000열' 정도로 줄이는 것이 큰 도움이 되었습니다.

세번째로 시도한 것은 상대적으로 더 느린 내장 함수를 좀 더 빠른 내장 함수 형식으로 고치는 것이었습니다. 사실, 더 느린줄 알면서도 그 함수를 쓰는 이유는 그 함수가 더 편하기 때문인데, 대표적으로 'VLOOKUP' 같은 것이 그렇습니다. 이 함수는 'MATCH'와 'INDEX'의 조합으로 고칠 수 있는데, 후자가 조금 더 빠르고, 이걸 수십만번 반복하다 보면 더 큰 차이가 납니다. 하지만 셀을 수정하는데는 훨씬 더 귀찮아집니다.

마지막으로, 최대한 데이터를 필터링 하지 않습니다. 처음에는 필터링한 결과에만 수식을 추가해 계산 횟수를 줄이려고 했는데, 열이 아주 많고, 필터링한 결과의 연속되지 않는 범위 수가 2048개보다 많으면 수식을 아래 셀에 연속해서 붙여넣을 수 없게 됩니다. 아마 '범위가 너무 복잡하다'는 메시지가 나올 겁니다. 그래서, 수식을 필터링 하지 않은 모든 셀에 붙여넣되 'IF()'로 감싸서 필터링에 나오지 않을 조건이면 계산을 수행하지 않는 식으로 해서 엑셀이 얼어붙은 동안 화장실에 다녀오는 대신 기지개를 한 번 펴고 주변을 서성이는 정도로 끝낼 수 있게 되었습니다.

... 적어놓고 보니 프로그램 동네에서는 본능적으로 당연하게 생각할 만한 것들 뿐인데, 괜히 최신 프로세서와 널럴한 메모리만 믿고 깝치다가 완전 바보됐습니다. 위에 이야기한 링크에는 계산을 빠르게 하기 위한 여러 가지 팁들이 널려 있는데, 그 중에는 프로세서나 메모리를 업그레이드 하는 아주 소극적인 방법부터 편의를 위해 여러 기능을 포함하는 대신 느리게 만들어진 내장 함수를 대체해 버리는 적극적인 방법도 있습니다. 기회가 되면 시도해 보는 것도 신나겠습니다.

2008/08/21 00:53 2008/08/21 00:53

, ,

게임내 딜레이의 영향력 계산하기.

계산하기라고 해서 뭐 그럴듯 한게 있는 건 아니고, 문득 예전에 마비노기에서 거래 후에 1분 동안 로그아웃할 수 없는 장치가 있었던 것을 생각해냈습니다. 아마도 목적은 거래의 안전성을 위해서라고 생각됩니다. 사기성 거래를 하고 나서 재빨리 로그아웃 해버리면, 특별히 기록하지 않은 상대방은 누구와 거래했는지를 잊어버릴 테고, 이걸로 사기범을 잡을 수 없게 된 대신에 게임을 향한 강력한 비난이 쏟아질 겁니다. 아마도 그래서 거래 후 로그아웃을 1분간 금지했던 것 같은데, 언제부터인가 사라졌습니다. 충분한 안전대책이 도입되었거나, 사용자들의 귀찮음에 의한 거라고 생각합니다만, 어느쪽이 정말인지는 모릅니다.

그런데, 실시간으로 진행되는 온라인 게임에, 안전을 이유로 주는 딜레이의 길이에 고민이 들어있을지를 생각해봤습니다. 즉, 거래 후에 로그아웃할 수 없는 시간은 왜 하필 '1분'인가 하는 점입니다. '59초'나, '61초'도 아닌, '1분' 동안 로그아웃을 할 수 없다는 점에는 무언가 이유가 있을지, 아니면 아무런 이유도 없을지 알 수 없었습니다. 적당히 기획 회의에서 '한 1분 정도면 되지 않겠어?' 하고 오간 말이 그대로 반영된 것인지도 모릅니다. 어쩌면 '1분'이 별로 바람직한 시간이 아닐지도 모릅니다.

이렇게 가늠해보면 어떨까 합니다. 단, 이것은 게임이 실시간으로 진행되어야 하고, 게임 내에서 하루하루 시간이 흐른다는 전재를 바탕으로 합니다. 마비노기에서 하루는 실제 시간의 36분입니다. 즉, 36분 1초째가 되면 전날의 동일한 시간이 됩니다. 마비노기에서 거래 후 1분 동안 로그아웃을 금지했을 경우, 이것은 하루의 '1/36'의 시간입니다. 즉, 실제 시간의 스케일로 보면 '40분'이 됩니다. 예전의 마비노기에서는 거래 후 40분 동안 로그아웃을 금지하고 있는 것이나 다름없습니다.

게임 내의 시간과, 플레이어들이 취하는 액션들의 스케일이 모두 다를 테니, 이런 계산을 그냥 갖다대고 판단할 수는 없지만, 최소한 게임 내 액션에 걸리는 시간을 설정할 때, 터무니없는 실수는 하지 않으리라고 생각합니다.

짤방: 처음 골렘을 본 날.

2005/12/03 03:13 2005/12/03 03:13

, , ,

[요즘에 쓴 글] [예전에 쓴 글]

(C)Milfy / neoocean.net, milfy@neoocean.net