본문 바로가기

딥러닝/파이썬

빅데이터,스트림데이터 in Python

파이썬은 인공지능(머신러닝,딥러닝)에서 굉장히 Hot 한 언어이다. 벡터,행렬 같은 머신러닝에 필요한 연산들을 제공해주는 라이브러리가 있기 때문에 , 그래프를 시각화해서 볼 수 있기 때문에, 이를 기반으로 여러 딥러닝 프레임워크들이 제공 되어진다.  

딥러닝이 머신러닝에 비해 본격적으로 주목을 받게 된것은 빅데이터에서의 퍼포먼스가 머신러닝 보다 더 뛰어나다는 연구결과가 있고 나서이다. 그리고, 현재 딥러닝 프로세스는 한번에 데이터를 저장한 다음에 처리하는 것이 아니라 , 지속적으로 데이터가 들어오면서 동시에 처리하고 이를 학습에 사용하는 Cycle의 형태이기 때문에 , 스트림 데이터에 대한 취급도 중요합니다.

(본 글은, 빅데이터 스트림 데이터에 대한 개념이 있다 가정하고 진행)

즉, 파이썬에서 빅데이터,스트림데이터를 취급하지 않을것이면, 차라리 머신러닝을 하는게 더 낫다.

그럼 ,이제부터  빅데이터,스트림데이터를 파이썬에서 어떻게 취급하는지 알아보자.

 

빅데이터,스트림데이터를 처리하기 위해선 무엇이 중요할까? 빅데이터를 딥러닝에서 이용하고자 할 때, 한번에 메모리에 못 올리는 경우가 허다하다.(메모리크기가 빅데이터 크기보다 작으니까).스트림 데이터는 

지속적으로 들어오므로 언제까지 들어올지 모른다.

기존의 , 시퀸스 형식으로 indexing을 해서 데이터를 받을 수는 있을 것 이다.  하지만, 데이터를 처리하기 위한 복잡한 logic이 필요할 것이다. 어떻게 해야 할까?

__iter__,__next__ 메소드를 구현해야하는 Iterator타입을 이용하면 됩니다. 

Iterator를 알기 위해선 Iterable에 대한 이해가 필요합니다. 

 

 

Iterable은 반복이 가능한 개체이며, __iter__메소드가 구현이 되어있어야합니다.

반복할 때  내부적으로 __iter__메소드를 호출하게 됩니다. 그리고, __iter__메소드는 iterator를 반환합니다.

 

Iterator는 내부적으로, __iter__,__next__메소드가 구현이 되어있어야합니다.

 

__next__메소드는 ,

반복할 때마다 다음 값을 가져오며 , 가져올 값이 없다면 StopIteration에러를 raise합니다.

 

__iter__메소드는

자기자신(iterator)를 바환합니다. 이 iterator는 Iterable이 반복하게 될 떄(ex.for loop)사용하게 됩니다.

 

(Fluent Python Chapter14 참조)

즉 Iterable는 iter를 통해 iterator를 반환하고,

iterator는 next를 통해 다음값을 가져오게되고 ,iter메소드가 있으므로 iterable타입이다.

 

 

__next__ 메소드의 가장 큰 특징은 lazy 하다는 특징을 갖고 있다는 것입니다. lazy 하다는 것의 반대 개념은 eager하다입니다. 이 개념들은 파이썬에서만 적용되는것이 아니라 컴퓨터과학 전반적으로 적용되는 개념입니다. lazy 하다는 것의 추상적인 설명은 '식의 평가를 나중에 하는 것입니다.' 예를 들어보면, 반복문에서 데이터를 가져올 때 , 기존의 시퀸스 타입은 모든 데이터를 메모리에 올려놓고 계산을 하게 됩니다. 하지만, iterator는 값을 참조하게 될 때 iter 메소드를 실행하면서, next메소드를 실행하게 되고 , next를 실행할 때 , 그 값을 메모리에 올리게 되므로 , 한번에 모든 데이터를 메모리 올리지 않아도 되는 장점이 있습니다.

 

이 부분은 ,https://nvie.com/posts/iterators-vs-generators/

위 사이트에 자세하게 설명이 되어있으므로 참고해주시면 감사하겠습니다.

 

그리고, 코드가 실행되는 시간까지 아끼기 위해서 iterator를 상속하는 generator라는 클래스가 있습니다.

 

generator는 함수형,표현식 2가지 유형으로 분류할 수 있습니다.

1.함수형: return대신 yield 를 사용  ,

2.표현식: comprehension 할 떄 , [] 가 아닌 () 를 사용

 

 

저희가 알고 있는 파이썬 함수는 호출을 하게 되면 return을 만나거나 끝까지 수행을 한다음에 호출을 종료하게 되비다. 하지만, yiled를 만나게 된다면, 그 line(줄)에서 함수를 멈추게 되고, 상태를 저장합니다 .

표현식 타입도 list comprehension을 사용하게 되면 , 표현식을 선언하게되면 안에 값들을 전부 메소드에 올리게 됩니다. 하지만, generator 표현식을 사용하게 된다면 , 식을 수행하지 않고 값을 참조할 때만 식을수행하게 됩니다.

 

 

 

Reference:,https://nvie.com/posts/iterators-vs-generators/

https://velog.io/@kho5420/Python-Lazy-Evaluation-%EC%9D%B4%EB%9E%80

https://ichi.pro/ko/python-eseo-lazy-evaluation-ilan-mueos-ibnikka-174801364451024

 책:Fluent in Python

 

작성중

'딥러닝 > 파이썬' 카테고리의 다른 글

Recursion using pass by reference  (0) 2021.09.19
시각화:Text,Color  (0) 2021.08.25
딥러닝에서의 파이썬  (0) 2021.08.22