본문 바로가기
SPARK

[SPARK] (중요)파이썬과 데이터 - RAM, Disk, CPU, Data type

by yeah-12 2024. 7. 15.

파이썬이 터졌다

일반적으로 컴퓨터 공학에서는 OOM(Out of Memory)이라 하며, 특히 대용량 데이터를 처리할 때는 자주 만나게 될 문제

스파크든, 파이썬이든 데이터 관리는 중요한 부분이다.

 

메모리 : 기억 장치로, 굉장히 세분화가 되어있지만, 크게 RAMDisk(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 정보를 필수로 한다.