zipfile을 메모리로 읽어 들여 내용을 numpy 배열 (numpy-datatypes)로 추출합니다. 파일이 상당히 크고 그 중 많은 파일이 있기 때문에 이것은 매우 효율적/빠른 방식으로 발생해야합니다. 불행히도 비슷한 질문을 보면 도움이되지 않았습니다. 데이터를 읽을 때 데이터를 numpy-datatypes로 변환 할 방법을 찾을 수 없었기 때문입니다. 또한 속도는 큰 문제로 밝혀졌습니다.파이썬은 zipfile을 numpy 배열로 효율적으로 읽습니다.
예는 다음 ZipFile를 "log_ks818.zip"가 필요한 다음과 같은 형식의 데이터에 포함 된 "log_file.csv"(YYYYMMDD의 hhnnsszzz, 플로트, 플로트, 제로)을 포함
20161001 190000100,1.000500,1.000800,0
20161001 190001000,1.001000,1.002000,0
20161001 190002500,1.001500,1.001200,0
...
가장 빠른 나는 (팬더를 사용하여) 지금까지 어떻게 관리하는 것이 :
zfile = zipfile.ZipFile("log_ks818.zip", 'r')
df = pd.read_csv(io.BytesIO(zfile.read("log_file.csv")), header=None, usecols=[0, 1, 2], delimiter=',', encoding='utf-8')
print(df.head())
을 그러나이 너무 느립니다 파일 (~ 80메가바이트 압축을 푼 경우),에 ~ 200 개 라인의 약 6 초 정도 걸립니다 (플러스는 NumPy와 목적이 아니다). 테스트 할 하드 드라이브의 추출 된 파일을 사용하여 다른 numpy/pandas-methods의 읽기 속도를 비교했을 때 np.fromfile은 0.08 초로 성능을 향상시켜 메모리에 저장했습니다. zip 파일에서 데이터를 읽을 때이 정도의 상태를 유지할 수 있다면 좋을 것입니다.
첫 번째 테스트 후 캐시를 지우시겠습니까? 왜냐하면 그렇지 않다면 후속 테스트가 실제로 디스크에서 파일을 읽는 것을 측정하지 않기 때문입니다. – pvg
나는 그렇게 생각한다. np.fromfile/zfile-test를 처음부터 실행하는 스크립트를 시작하면 매회 0.08과 6을 얻게됩니다. 캐싱이 어디서 일어날 지 잘 모르겠습니다. –
csv 파일을 로딩 할 때'pandas' 리더가 가장 빠릅니다. Numpy 로더는 한 줄 한 줄씩 파일을 읽고 그 목록을 작성합니다. 나는 지퍼 부분이 차이를 만든다고 생각하지 않습니다. – hpaulj