나는 수백만 개의 행과 100 개 이상의 컬럼을 가진 Oracle 데이터베이스로 작업하고 있습니다. 특정 열을 인덱싱 한 pytables를 사용하여이 데이터를 HDF5 파일에 저장하려고합니다. 나는 팬더 DataFrame에서 이러한 데이터의 하위 집합을 읽고 계산을 수행 할 것입니다.오라클에서 수백만 행의 큰 테이블 읽기 및 HDF5 작성하기
내가 시도한 다음
다운로드 테이블, csv 파일로 유틸리티를 사용하여, 덩어리 사용 팬더하여 CSV 파일 청크를 읽고 pandas.HDFStore
를 사용하여 HDF5 테이블에 추가합니다. dtype 정의를 작성하고 최대 문자열 크기를 제공했습니다.
그러나 Oracle DB에서 직접 데이터를 다운로드하고 pandas.HDFStore
을 통해 HDF5 파일에 게시하려고 할 때 몇 가지 문제가 발생합니다.
pandas.io.sql.read_frame은 청크 읽기를 지원하지 않습니다. 전 메모리에 전체 데이터를 먼저 다운로드 할 수있는 충분한 RAM이 없습니다.
고정 된 수의 레코드로 cursor.fecthmany()
을 사용하려고하면 DB 테이블에서 읽기 작업이 오래 걸리고 색인이 생성되지 않으며 날짜 범위 아래에있는 레코드를 읽어야합니다. 나는 DataFrame(cursor.fetchmany(), columns = ['a','b','c'], dtype=my_dtype)
을 사용하고 있지만 생성 된 DataFrame은 내가 제공 한 dtype을 적용하지 않고 항상 dtype을 유추합니다 (제공하는 dtype에 부합하는 read_csv와는 다릅니다). 따라서이 DataFrame을 이미 기존 HDFDatastore
에 추가하면 유형 불일치가 발생합니다. 예 : float64는 하나의 청크에서 int64로 해석 될 수 있습니다.
당신이 생각을 제공하고 올바른 방향으로 나를 가리킬 수 있다면 감사하게 생각하십시오. 이 메모리 부족 작동을 위해 설계부터
는
현재 접근 방식 (csv 사용) 및 dtype 수정이 적절합니다. SQL은 0.14에서 주요 업데이트를 얻게 될 것입니다 (0.13은 곧 출시 될 예정입니다). 따라서 불행히도 dtype infererence/chunking을 사용할 수 없습니다. PRS에 오신 것을 환영합니다! 이 문제를 참조하십시오 : https://github.com/pydata/pandas/issues/4163 – Jeff
사물의 오라클 측면에 문제가 없다면 Oracle 태그를 제거하는 것이 좋습니다. –
dba에게 테이블을 범위 파티셔닝 된 오브젝트로 변환하도록 요청해야합니다. 파티션으로 액세스하기 쉬워야합니다. – klashxx