2014-05-20 3 views
0

500MB의 데이터 세트를 가지고 있다면 100MB의 데이터 만 읽으려는 테스트를 수행하고 싶습니다. 이것은 단지 예일뿐입니다. 일반적으로 내 데이터 집합의 크기가 x 인 경우 x/k 양만 읽을 수 있기를 원합니다.파이썬을 사용하여 메모리에 저장되는 데이터의 양을 제한하고 데이터가 메모리에 맞지 않는 경우를 처리하는 방법을 제한 하시겠습니까?

데이터 형식은 numpy 배열입니다. 코드 흐름은 다음과 같습니다.

data = pickle.load(open('test.data', 'rb')) 
nrows = data.shape[0] 
ncols = data.shape[1] 
sketch = np.zeros((k, ncols) #k << n 
for item in data: 
    Do Something 

데이터가 메모리에 맞지 않을 때 스트리밍 모델을 시뮬레이트하고 싶습니다. 스트리밍 모델은 데이터를 한 번만 전달할 때 사용됩니다.

파이썬이 메모리에 들어 가지 않을 때 어떻게 데이터 집합을 처리합니까? 예를 들어 숫양이 4GB이고 위의 pickle 데이터가 40GB라면 어떤 일이 발생합니까?

+2

numpy에는 피클을 사용하지 마십시오. hdf5를 사용해야합니다. – HYRY

+1

코어 메모리에 맞지 않는 것을 unpickle하려고하면 파이썬은'MemoryError' 예외를 던집니다. [메모리 매핑 배열] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html)은 RAM에 맞지 않는 대용량 데이터 집합을 처리하는 데 유용 할 수 있습니다. –

답변

0

나는 동의하므로 @HYRY 및 @ali_m의 의견을 병합합니다. 데이터가 메모리에 맞지 않는 경우 , "핵심"을 다루는 가장 쉬운 방법입니다. 데이터가 디스크에 있음을 의미하지만 소프트웨어 계층은 메모리에있는 것처럼 거의 상호 작용할 수 있습니다. numpy에 내장 된 솔루션이 있습니다 : memory mapping. 정말 좋은 패키지는 pytables입니다. 첫 번째 파일은 데이터를 이진 파일로 저장하고 numpy는 RAM 블록 상단 대신 파일 상단에 놓습니다. 그런 다음 배열에서의 작업을 포함하여 데이터로 원하는 모든 작업을 수행 할 수 있습니다. 다른 하나는 HDF5 파일을 필요로하며 코어에서 벗어난 일부 작업을 지원하며 빠른 속도로 빨라지고 두 번의 작업이 줄어들지 만 더 제한적입니다. 반면에 HDF5는 다른 많은 언어에서 액세스 할 수있는 매우 인기있는 형식이므로 매우 좋은 선택입니다.

+0

py 테이블을 사용하여 하나의 레코드 또는 100 개의 레코드 만 RAM에 지정할 수 있습니까? – gizgok

관련 문제