2016-07-20 1 views
3

나는 약 90GB 인 gzip입니다. 이것은 디스크 공간 내에 있지만 RAM보다 훨씬 큽니다.RAM 제한보다 큰 gzip 파일을 팬더 DataFrame으로 가져 오는 방법은 무엇입니까? "Kill 9"HDF5를 사용 하시겠습니까?

팬더 데이터 프레임으로 어떻게 가져올 수 있습니까?

# start with Python 3.4.5 
import pandas as pd 
filename = 'filename.gzip' # size 90 GB 
df = read_table(filename, compression='gzip') 

그러나, 몇 분 후, 파이썬은 Kill 9으로 종료

: 나는 명령 줄에 다음을 시도했다.

데이터베이스 개체 df을 정의한 후 HDF5에 저장하려고했습니다.

올바른 방법은 무엇입니까? 어떻게 이것을 pandas.read_table() 사용할 수 있습니까?

답변

9

나는 이런 식으로 할 거라고 : 이것에 대한

filename = 'filename.gzip'  # size 90 GB 
hdf_fn = 'result.h5' 
hdf_key = 'my_huge_df' 
cols = ['colA','colB','colC','ColZ'] # put here a list of all your columns 
cols_to_index = ['colA','colZ'] # put here the list of YOUR columns, that you want to index 
chunksize = 10**6    # you may want to adjust it ... 

store = pd.HDFStore(hdf_fn) 

for chunk in pd.read_table(filename, compression='gzip', header=None, names=cols, chunksize=chunksize): 
    # don't index data columns in each iteration - we'll do it later 
    store.append(hdf_key, chunk, data_columns=cols_to_index, index=False) 

# index data columns in HDFStore 
store.create_table_index(hdf_key, columns=cols_to_index, optlevel=9, kind='full') 
store.close() 
+0

감사합니다! 'chunksize' 매개 변수는 스크립트 충돌 여부에 따라 조정됩니다 (위와 같습니다)? – JianguoHisiang

+0

@ JianguoHisiang 예, 교육용 추측을 할 수 있습니다 ... 예를 들어, 서버에 32GB RAM과 1M ('10 ** 6') 행이있는 경우 DF에 1GB가 필요합니다. 최대 20M ('2 * 10 ** 7') 테스트를하고 속도 혜택을 제공하는지 여부를 확인하십시오. – MaxU

+0

입력 파일'filename.gzip'에는 헤더가 없습니다. 'cols_to_index'는 이미 데이터 프레임에 레이블이 지정되어야하는 열을 가리 킵니다. 맞습니까? 헤더가없는 gzip 파일에 대해 이렇게하려면 위의'pd.read_table()'에서 각 반복에서 데이터 열을 인덱싱해야합니까? 그게 비효율적 일 수 있습니다 ... – JianguoHisiang