Wireframe

대용량 데이터와 엑셀 파일

엑셀과 같은 프로그램을 스프레드 시트라고 한다. 스프레드 시트는 개념상 무한히 큰 종이를 행과 열로 나누고 여기에 데이터와 수식을 넣어서 표를 계산하거나 데이터를 분석하는 프로그램을 말한다. 하지만 ‘무한히 큰 종이’는 말 그대로 개념적인 것이며, 실제로 컴퓨터의 메모리는 유한하기 때문에 스프레드 시트의 크기 역시 실제로는 유한한 크기를 갖는다.

엑셀 파일은 가로세로로 늘어선 표 형식의 값과, 이 값들을 참조하여 자동 계산하는 수식과 셀의 서식, 차트, 피봇 테이블 등 여러가지 데이터들을 포함하는 형식을 가지고 있다. 순수하게 데이터의 크기만을 고려할 때, 엑셀 2013 이전 버전에서 엑셀 파일은 하나의 시트당 최대 65,536행 x 16,384열의 데이터를 포함할 수 있다. 2016이후 버전에서는 1백만행(1,048,576)까지 그 범위가 확장되었다.

엑셀을 사용하지 않고 엑셀 파일을 생성하는 방법이 존재하며, 그런 방법을 사용했을 때에는 실제로 이보다 더 큰 엑셀 파일을 만드는 방법도 존재한다. 하지만 이러한 파일을 엑셀에서 열었을 때에는 해당 버전의 엑셀이 허용하는 범위 외의 데이터는 읽어들이지 않게 된다. 실제로 2020년 영국에서 코로나 검사 결과를 취합하는 과정에서 엑셀 포맷의 데이터를 사용하여 개별 검사 데이터를 취합하는 시스템에서 65,536행 이후의 데이터가 누락되는 일이 있었다. 문제를 발견한 이후에 해당 시스템은 엑셀 파일이 아닌 csv 파일을 사용하도록 변경되었다고 한다.

엑셀에서 정상적으로 열리지 않는 엑셀 파일의 데이터를 열기 위해서는 파이썬 등의 프로그래밍 언어에서 엑셀 파일을 액세스할 수 있게 해주는 라이브러리를 사용할 수 있다. 엑셀 파일을 읽기위해서 많이 사용되는 라이브러리로는 xlrd 나 openpyxl이 있다. xlrd의 경우 백만행을 넘어가는 엑셀 파일은 열지 못하는 것으로 알려져 있다. 그리고 openpyxl에서 큰 엑셀 파일을 열 때에는, 메모리 사용량에 유의해야 한다.

엑셀 파일을 처리하는 과정에서 많은 메모리를 사용한다. 우선 엑셀 파일 전체를 메모리에 올려야 하고, 각 행의 데이터마다 각각의 셀을 키와 값의 쌍으로 변환하고 이 데이터를 다시 데이터프레임으로 변환하여 병합하는 과정을 거치기 때문이다. 또한 시간 역시 엄청나게 오래 걸린다는 문제가 있다. (대략 원본 파일의 50배 크기의 메모리가 필요한 것으로 알려져 있다.)

엑셀 자체는 훌륭한 애플리케이션이나 큰 데이터셋을 처리하기에는 어울리지 않는다. 엑셀의 데이터는 그 데이터로 처리하기가 까다로운 구조를 가직 있다. 따라서 대용량 데이터를 파일로 저장해서 다룰 때에는 csv 포맷이나 json, 파이썬 한정하여 pickle 등의 포맷을 사용하는 편이 권장된다.

이들 데이터는 직렬화되어 있고, 그 포맷이 간단하기 때문에 읽어들이는데 훨씬 적은 시간과 메모리가 소요되고 (csv의 경우 엑셀 파일보다 100배 이상 빠르게 로딩이 가능하다) 엄청 나게 큰 파일인 경우에도 파일에서 필요한 부분만 읽어서 처리하여 메모리 사용량을 줄일 수 있는 방법도 있기 때문이다.

Exit mobile version