2017-02-03 1 views
3

필자는 쓰기가 가능한 2Gb의 데이터 프레임을 가지고 많은 df를 읽습니다. 팬더에 df를 사용하고 싶습니다. 따라서 df.read_hdfdf.to_hdf을 읽기 및 쓰기에 꽤 잘 작동하는 고정 형식으로 사용하고있었습니다.pandas.to_hdf를 사용하여 df에서 지정된 열을 빠르게 읽음

그러나 df는 더 많은 열을 추가하면서 커지기 때문에 대신 테이블 형식을 사용하여 데이터를 읽을 때 필요한 열을 선택할 수 있습니다. 나는 이것이 나에게 속도 이점을 줄 것이라고 생각했다. 그러나 테스트에서 이것은 그렇지 않은 것처럼 보인다.

이 예 :

import numpy as np 
import pandas as pd 
df = pd.DataFrame(np.random.randn(10000000,9),columns=list('ABCDEFGHI')) 
%time df.to_hdf("temp.h5", "temp", format ="fixed", mode="w") 
%time df.to_hdf("temp2.h5", "temp2", format="table", mode="w") 

는 고정 된 형식이 약간 빠른 보여줍니다 (내 컴퓨터에 6.8s 대 5.9 초).

그런 다음 데이터를 읽기 (확인 파일을 만들기 위해 작은 휴식 후가 완전히 저장되어있는) :

%time x = pd.read_hdf("temp.h5", "temp") 
%time y = pd.read_hdf("temp2.h5", "temp2") 
%time z = pd.read_hdf("temp2.h5", "temp2", columns=list("ABC")) 

수익률 :

Wall time: 420 ms (fixed) 
Wall time: 557 ms (format) 
Wall time: 671 ms (format, specified columns) 

내가 고정 된 형식이 빠른에서 이해 할을 데이터를 읽지 만 지정된 열이있는 df가 전체 데이터 프레임을 읽는 것보다 속도가 느린 이유는 무엇입니까? 고정 서식보다 테이블 서식 (지정된 열의 유무에 관계없이)을 사용하면 어떤 이점이 있습니까?

df가 커지면 메모리 이점이 있습니까?

답변

3

IMO data_columns=[list_of_indexed_columns]과 함께 format='table'을 사용하면 가장 큰 이점은 조건부로 (where="where clause" 매개 변수 참조) 거대한 HDF5 파일을 읽을 수 있다는 것입니다. 따라서 을 필터링하면서을 읽고 데이터를 청크로 처리하여 MemoryError를 피하십시오.

대부분의 시간을 함께 읽는 단일 열 또는 열 그룹을 다른 HDF 파일이나 다른 키가있는 동일한 파일로 저장하려고 할 수 있습니다. (HDF5 고정, HDF %의 테이블 : 세 가지 형식으로

import feather 

디스크에 쓰기 : Feather-Format

테스트 및 타이밍 -

는 또한 "최첨단"기술을 사용하여 생각 하는데요 디스크에서 읽어 깃털)

df = pd.DataFrame(np.random.randn(10000000,9),columns=list('ABCDEFGHI')) 
df.to_hdf('c:/temp/fixed.h5', 'temp', format='f', mode='w') 
df.to_hdf('c:/temp/tab.h5', 'temp', format='t', mode='w') 
feather.write_dataframe(df, 'c:/temp/df.feather') 

:

In [122]: %timeit pd.read_hdf(r'C:\Temp\fixed.h5', "temp") 
1 loop, best of 3: 409 ms per loop 

In [123]: %timeit pd.read_hdf(r'C:\Temp\tab.h5', "temp") 
1 loop, best of 3: 558 ms per loop 

In [124]: %timeit pd.read_hdf(r'C:\Temp\tab.h5', "temp", columns=list('BDF')) 
The slowest run took 4.60 times longer than the fastest. This could mean that an intermediate result is being cached. 
1 loop, best of 3: 689 ms per loop 

In [125]: %timeit feather.read_dataframe('c:/temp/df.feather') 
The slowest run took 6.92 times longer than the fastest. This could mean that an intermediate result is being cached. 
1 loop, best of 3: 644 ms per loop 

In [126]: %timeit feather.read_dataframe('c:/temp/df.feather', columns=list('BDF')) 
1 loop, best of 3: 218 ms per loop # WINNER !!! 

추신 feather.write_dataframe(...)을 사용하는 경우 다음과 같은 오류가 발생할 경우 : 여기

FeatherError: Invalid: no support for strided data yet 

는 해결 방법입니다 : 제대로 작동해야 feather.write_dataframe(df, path)

df = df.copy() 

...

+0

감사합니다. 전환 된 데이터를 저장하는 방법에 대해 자세히 설명해 주시겠습니까? 별도의 키를 사용하여 열을 저장해야하지만 동일한 hdf 파일에 저장해야한다는 의미입니까? 어쩌면 예를 들어 주시겠습니까? – user6538642

+0

@ user6538642, 귀하의 "보통"대략입니까? DF 모양? – MaxU

+1

shape = (6mln * 50), 열 수는 최대 수백까지 확장됩니다. 색인은 다중 색인 (datetime 형식의 날짜 및 이름) – user6538642

관련 문제