Language/python

너무 큰 데이터 처리

비비이잉 2021. 8. 17. 11:46
반응형

tf.data.Dataset 은 tensorflow 훈련 데이터를 다룰 때 아주 편리하다. padding, batch, shuffle, map 기능을 다 제공하고 있기 떄문이다. from_tensor_slices를 쓰면 numpy array를 바로 Dataset으로 변환해준다. 

 

근데 변환하려는 전체 데이터를 메모리에 올릴 수 있는 크기가 아니면, 메모리 에러가 뜬다,, OOM !

 

--> Dataset의 from_generator를 사용해보자 

: 이 방법은 메모리에 다 데이터를 로딩하는 것이 아니라 필요할 때만 python generator를 통해서 데이터를 가져오기 때문에 메모리 사용량을 줄일 수 있다는 것이 특징이다. 실제로는 데이터를 로딩하지 않는 방식이기 때문에 !

 

찾아보니까 from_tensor_slices가 메모리를 전체에 올려서 할당하는 거라 numpy로 했을때 메모리 오류가 날 수 있는 거라고 한다. 

결론은 Generator(제너레이터)를 만들어서 코딩하는 것~!

 

<generator vs list 비교>

generator 

- 값을 만들어내는 한 방식, 실제의 일련의 값들을 만들어 내는 것이 아니기 때문에 메모리 측면에서 좋음, 필요할때까지는 값을 계산하지 않는다는 특징, 메모리를 효율적으로 사용할 수 있을 뿐 아니라 계산비용도 절감할 수 있음. 

- 데이터의 양이 많아지고 메모리 사용량을 최적화해야하는 상황일때 필수적

- 대용량의 반복의 수행해야할 때, 메모리를 효율적으로 사용하기 위한 도구 

 

 

def square_generator(nums):
	for num in nums:
    	yield num * num
        
result = square_generator(nums)
print(result)

#generator object square_generator at 0x10f4d2d68

 

list - 값들의 모음. 일정량의 메모리가 소모됨

 

 

yield 와 return 의 차이 

 

즉 yield를 사용하면 원하는 값을 리턴하며, 실행 흐름을 일시 정지하여 함수를 재활용할 수 있는 상태로 만들 수 있다

<generator expression>

list - [

geneartor - (

result = (i*i for i in range(0,10))
print(result)

for num in result:
print(num)


#<generator obejct <genexpr> at ~~~
#0
#1
#4
#9
#16
#25
#36
#49
#64
#81
반응형