파이썬이 터졌다
일반적으로 컴퓨터 공학에서는 OOM(Out of Memory)이라 하며, 특히 대용량 데이터를 처리할 때는 자주 만나게 될 문제
스파크든, 파이썬이든 데이터 관리는 중요한 부분이다.
메모리 : 기억 장치로, 굉장히 세분화가 되어있지만, 크게 RAM과 Disk(SSD)로 나눔
RAM : 작업 공간
- 데이터를 갖고 작업 하기 위해 우리는 데이터를 RAM이란 곳에 올림 (read_csv 등)
- 여기에 OS(윈도우 등)와 기본적인 프로그램을 올리면 2~6GB 정도 차지
- 컴퓨터를 끄면 RAM에 올라간 데이터는 삭제됨
- 책상, 도마
Disk : 저장 공간
- 장기적으로 데이터를 보관(저장)하는 공간
- 컴퓨터를 꺼도, Disk의 데이터는 사라지지 않는다
- 윈도우에서는 작업 관리자, 맥에서는 활성 상태 보기, 리눅스에서는 htop 등으로 메모리 사용량을 확인할 수 있다.
CPU : 저장 공간
- CPU는 일꾼입니다. 보통 컴퓨터는 여러 일꾼을 가지고 있다.
- 모두 이해할 필요는 없으며, 가장 중요한 것은 코어의 수
- 같은 코어 수라도, 고성능의 CPU는 수배 이상 빠를 수 있다.
- 하나의 작업을 위해 여러 코어를 사용하는 것을 병렬 처리라고 함
- 스파크 또한 여러 대의 PC를, 그리고 각 PC의 여러 코어를 모두 사용

Data Type
- 메모리에는 그럼 어떤 데이터가 올라가는지 살펴보자
- 파이썬이 다루는 데이터를, Pandas를 기반으로 보겠습니다.MySQL과 같은 Database도 비슷)
- 내부적으로는 각 데이터에 대한 명확한 타입(=스키마)이 있다.
- 따라서 적절한 데이터 타입을 사용,관리하면, 보통 30%~70% 의 메모리를 절약할 수 있다.
- 하나의 컬럼에는 하나의 동일한 데이터타입을 사용해야 한다.
1) 정수Integers
컴퓨터에서는 정수를 이진법(0,1)으로 표현한다.
- 뒤의 숫자는 얼마나 많은 메모리를 할당assign할 것인지에 대한 것
- 더 많은 메모리를 할당할수록, 더 큰 숫자를 담을 수 있다
- int8:-128 ~ 127
- int16: -32768 ~ 32727
- Int32: -2,147,483,648 ~ 2,147,483,647
- Int64: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 > 판다스 기본(공간 많이 줌)
- 엄밀히는, 부호를 위해 1비트(메모리의 단위)를 사용합니다
2) 오버플로Overflow
- 크기에 맞지 않는 데이터를 넣어 의도하지 않은 결과가 나오는것을 오버플로overflow라고 함
- 파이썬의 데이터 타입은 기본적으로 동적Dynamic이기 때문에 자동으로 데이터형이 바뀐다.
- 파이썬 : int64 보다 크게 할 수 있음, 자기 알아서 늘렸다 줄였다함
- pandas & numpy : int64가 한계, 자기 알아서 넉넉하게 주지만 줄이지는 않는다.
- 따라서 큰 숫자를 다루는 것은 굉장히 주의해야 함!
3) 부동소수점Floating points
- 부동소수점은 사람에게 직관적이지 않지만, 컴퓨터는 부득이 사용하는 개념
- 앞에서 보았듯 컴퓨터는 이진법을 사용하기 때문에, 정수는 어렵지 않게 표현할 수 있다
- 하지만 0.2, 18.5, 파이와 같은 정수가 아닌 숫자는 정확하게 표현할 수 없다.
- 5.96e-54같은 게 바로 부동소수점
- 부동소수점은 하나의 숫자를 형태와 자릿수로 구분하여 표현하는 것
- 예를 들면 478.224 = 4.78224 * 10^2 / 0.0098765 = 9.8765 * 10^-3
- 일부의 데이터는 형태(4.78224)를, 나머지 데이터로 자릿수(2)를 표현
- 이진법이고, 소수부와 정수부가 다르기 때문에 정확하게는 조금 다르다.
- 부동소수점 또한 정수와 마찬가지로 float16, float64 등을 사용하는데, 더 큰 메모리를 사용할수록 값이 정확해지지만 데이터가 더 무거워진다.
- 부동소수점 오차
- 부동소수점은 그 원리상 필연적으로 오차를 동반한다.
- 이러한 오차는 더 많은 메모리(16 → 32)를 사용할수록 줄어들지만 이론적으로는 무한히 많은 메모리를 사용해야만 이 오차를 정확히 없앨 수 있다
- 딥러닝의 경우 메모리 사용을 줄이기 위해, 의도적으로 오차를 감수해서라도 메모리를 줄이기도 합니다(float 16등) > 양자화
- 부동소수점 오차
4) String, Category
- 문자열은 문제가 더 복잡하다.
- 일반적으로 우리에게 친숙한 대부분의 소프트웨어는 유니코드unicode를 이용하여 문자열을 인코딩한다.
- 중요한 것은 메모리를 굉장히 많이 차지한다는 것
- 이에 대한 대안으로, 범주Category형 자료를 사용할 수 있다.
- Pandas의 경우 각 데이터의 고유값을 내부에서 숫자로 치환하여 사용
- 본래 문자열로 이루어졌던 Species 칼럼을 범주형으로 변환(SpeciesCate)
- 해당 범주 자료가 내부에서는 숫자로 사용되고 있음 (SpeciesCateCode)
- 이를 통해 90%이상의 메모리를 절약할 수 있다
5) Datetime
- 시간과 관련된 정보
- 일반적으로 소프트웨어들은 Unix Timestamp를 기준으로 함
- UTC time zone을 사용합니다. (태평양 기준이라 한국과 9시간 차이남, KST로 변환하기도 함)
- 1970년 1월 1일 0시를 기준으로 몇 초가 경과했는지를 숫자로 표현한 것입니다.
- 연, 월, 일 시 등의 표현은 사람마다, 소프트웨어마다, 회사마다, 팀마다 모두 다를 수 있다
- 이러한 표현들을 일반적으로 표현하기 위한 양식 또한 존재함
- 이를 통해 숫자인 Unix timestamp를 사람이 이해 가능한 문자열로 바꾸거나 거꾸로 문자열을 Unix timestamp로 바꿀 수도 있다
- 일반적으로 년도을 %y나 %Y(4자리)로, 월을 %m, 일은 %d로 표현
## 21년 11월 6일 4시 30분을 파싱
dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
dt
>> datetime.datetime(2006, 11, 21, 16, 30)
6) Time zone (중요!!)
- 시간대time zone은 시간 데이터를 다룰 때 굉장히 중요한 부분
- 특히 소프트웨어는 범국가적이기 때문에, 시간의 표준화는 필수
- 일반적으로 컴퓨터 공학에서는 UTC를 기준으로 하며, Unix timestamp도 UTC를 따른다.
- 대부분의 Database 또한 timezone 정보를 필수로 한다.
'SPARK' 카테고리의 다른 글
| [SPRAK] 스파크를 최대한 안쓰기 위한 방법 (Sampling,분할처리,Dask,자동화) (0) | 2024.07.18 |
|---|---|
| [SPARK] 병렬 처리, 분산 처리, Vectorize, CPU, GPU,Joblib (1) | 2024.07.18 |
| [SPARK] 클라우드 사용 이유 3가지 (스토리지, 엔진, 데이터베이스) (0) | 2024.07.15 |
| [SPARK] 파일 유형, I/O (0) | 2024.07.15 |
| [SPARK] SPARK란? 사용이유 (0) | 2024.07.15 |