2013-08-06 1 views
2

두 개의 NetCDF 파일 (각각은 521.8MB)에서 데이터를 가져 오는 프로젝트를 진행하고 있습니다. 틀림없이이 파일들은 꽤 큰 파일입니다. 4GB의 메모리가있는 MacBook Pro를 사용하고 있지만 컴퓨터의 수명은 약 4 년입니다. 코드는 Python으로 작성됩니다.대용량 데이터 파일을 효율적으로 가져 오는 방법, Python

파일에는 지구상에 1 년간의 기상 데이터가 들어 있습니다. 시간 (길이 1460), 고도 (길이 17), 위도 (길이 73) 및 경도 (길이 144)를 포함하는 4D 배열입니다. 한 번에 그 정보의 특정 부분 만 필요합니다. 특히, 나는 모든 시간을 필요로 하나의 고도 수준, 그리고 위도와 경도 (20x44)의 특정 지역 만 필요합니다.

두 파일에서이 데이터를 모두 모아서 필요한 데이터 만 확인하고 계산을 수행 한 다음 데이터를 텍스트 파일로 출력하는 코드가있었습니다. 그 해가 끝나고 63 년 동안 같은 크기의 파일 126 개가 반복되었습니다. 이제 코드는 프로세스가 시작될 때 메모리가 부족하다고 말합니다. 관련 코드는 다음과 같습니다.

from mpl_toolkits.basemap.pupynere import NetCDFFile 

#Create the file name for the input data. 
ufile="Flow/uwnd."+str(time)+".nc" 
vfile="Flow/vwnd."+str(time)+".nc" 

#Get the data from that particular file. 
uu=NetCDFFile(ufile) 
vv=NetCDFFile(vfile) 

#Save the values into an array (will be 4-dimentional) 
uwnd_short=uu.variables['uwnd'][:] 
vwnd_short=vv.variables['vwnd'][:] 

따라서 첫 번째 섹션은 NetCDF 파일의 이름을 만듭니다. 두 번째 섹션은 NetCDF 파일에서 모든 데이터를 가져옵니다. 세 번째 섹션에서는 가져온 데이터를 가져 와서 4D 배열에 배치합니다. (이것은 기술적으로 파이썬이 데이터와 어떻게 작동하는지에 대한 배열이 아니지만 C++ 배경 때문에 생각했습니다. 적절한 어휘 부족에 대해 사과합니다.) 나중에 필자는 필요한 특정 데이터를 분리합니다. 4D 배열에서 가져 와서 필요한 계산을 수행하십시오. 문제는 이것이 작동하는데 사용되었지만, 이제는 컴퓨터가 vv=NetCDFFile(vfile) 라인에서 작업하는 동안 메모리가 부족합니다.

어딘가에 메모리 누수가 있습니까? 전체 파일을 가져 오지 않도록 필요한 특정 범위의 데이터 만 가져 오는 방법이 있습니까? 데이터를 가져 와서 계산에 필요한 데이터 섹션을 정렬하는 것보다 효율적인 방법이 있습니까?

+1

가능한 경우 가져 오는 파일에서 몇 줄의 샘플 데이터를 제공 할 수 있습니까? – ChrisProsser

+0

하나의 파일을 가져 와서 배열에 저장하고 배열을 출력하면 다음과 같이됩니다. '[[[4.10000610e + 00 4.50001526e + 00 4.80000305e + 00 ..., 2.90000916e + 00 3.30000305e + 00 3.70001221e + 00] [3.00001526e + 00 3.50001526e + 00 3.90000916e + 00 ..., 1.60000610e + 00 2.10000610e + 00 2.50001526e + 00 [-9.99984741e-01 - 6.99996948e-01 -3.99993896e-01 ..., -1.49998474e + 00 -1.39999390e + 00-1.19999695e + 00 ... '물론 숫자는 계속되고 나중에 척도와 오프셋을 사용합니다. – Stephen

+0

ncdump를 마침내 알아 낸 덕분에 출력은 다음과 같이 보입니다. -16146, -16176, -16226, -16306, -16436, -16616, -16836, -17056, -17286, -17506, -17706, -17866 , -17976, -18016, -17996, -17916, -17776, -17566, -17306, -17016, -16746, -16526, -16416, -16416, -16496, -16606, -16726, – Stephen

답변

3

아마도 nccopy를 사용하여 파일을 다시 채운 다음 청크를 처리해야합니다. 일부 변수는 메모리에 맞게 커 보이는 것 같기 때문입니다. 그 이상의 메모리 취득 (또는 가상 메모리를.)

nccopy 문서는 여기 http://www.unidata.ucar.edu/software/netcdf/docs/guide_nccopy.html

+0

" 더 많은 메모리를 얻으십시오. "- 충분한 메모리가 없다고 가정하더라도 프로그램이 제대로 작동하지 않는다는 의미는 아닙니다. 이것은 페이지 파일과/스왑이 아닌가? – pzkpfw

+0

나는 rechunking이 무엇을하는지 이해하지 못합니다. 원본 파일의 4 차원 길이는 1464, 17, 73 및 144입니다. 1464, 17, 50 및 50으로 다시 채우려고 시도하고 새 파일은 750MB (원본은 522MB)입니다. 1464, 17, 20 및 20으로 다시 채우면 새 파일은 637 MB가됩니다. 이것은 나보다 작거나 효율적인 것으로 보이지 않습니다. 내가 빠진 것이 있습니까? – Stephen

0

그것은 가치가 무엇을위한, 내 컴퓨터에 너무 많은 데이터를 보유하고 메모리가 부족했다 바람 않았다. 외장형 하드 드라이브를 가지고 작업하고 파일들을 제거했습니다. 그런 다음 ncgen, ncdump 등을 사용하는 방법을 알아 냈습니다. 필요한 모든 데이터를 각 대형 파일에서 가져 와서 그 데이터만으로 새 파일을 만들 수있었습니다. 이것은 NetCDF 파일을 500MB에서 5MB로 줄였습니다. 이로 인해 코드 실행 속도도 빨라졌습니다.

+0

나는 하이퍼랩 전역 파일에 'ncks'를 사용하여 메모리 효율적인 읽기/쓰기를위한 위도 대역으로 자주 사용합니다. http://nco.sourceforge.net/nco.html#ncks-netCDF-Kitchen-Sink – N1B4

관련 문제