2017-03-28 1 views
0

현재 Python 2.7의 ZipFile을 사용하고 있습니다. 나는 여러 파일을 압축하여 사용자에게 보내는 메모리 문제에 직면 해있다.파일 압축시 Python 2.7의 ZipFile 동작

나는 코드가있을 때 : 어떤 시점에서

fp = open('myzip.zip', 'w') 
archive = zipfile.ZipFile(fp, 'w', zipfile.ZIP_DEFLATED) 
for filepath in filepaths: 
    archive.write(filepath) 
archive.close() 

합니까 파이썬로드 모든 파일을 메모리에를? 파이썬이 파일의 내용을 zip으로 스트리밍 할 것으로 예상 했었지만, 그렇다고 확신하지는 않습니다.

+1

모듈이 8 * 1024 문자를 한 번에 메모리로 읽는 것처럼 보입니다. https://hg.python.org/cpython/file/2.7/Lib/zipfile.py#l1179 – Sush

+0

'ZipFile.write()'doesn 많은 기억을 소비하지 않습니다. 언급 한 바와 같이 적당한 크기의 블록을 사용하며 사용되는대로 해제됩니다. 프로그램 자체가 커지거나 메모리 문제로 다른 것을 의미합니까? 운영 체제는 쓰기 작업을 캐시하므로 OS가 데이터를 커밋하기 시작할 때까지 빠릅니다. 그러면 일들이 조금 늪에 빠질 수도 있습니다. – tdelaney

+0

흥미 롭군요, OK 빨간색 청어 일 수도 있습니다 –

답변

0

This question/answer (둘 다 사용자가 동일 함)은 모두 메모리에서 완료되었음을 나타냅니다. 그것들은 수정 된 라이브러리 EnhancedZipFile에 대한 링크를 제공합니다.이 라이브러리는 원하는대로 작동하지만 프로젝트에서 많은 활동을하지 않은 것처럼 보입니다.

zip에 특별히 의존하지 않으면 this answer은 bzip 라이브러리가 큰 파일을 처리 할 수 ​​있음을 의미합니다.

+0

작성자는 작성된 파일의 이름을 수정하려고했기 때문에'writestr'을 사용하고있었습니다. 이 방법을 사용하려면 전체 파일을 메모리로 읽어야하지만 여기에서 사용되는 방법은 그렇지 않습니다. 파이썬 3.6에서,'ZipFile.open'은 쓰기 모드를 지원합니다 ... 그래서 이것은 결국 고쳐졌습니다! – tdelaney

0

파이썬은 메모리에서 반복하는 모든 파일을 보유 할 것이므로 운영 체제에서 작업을 수행 할 실행 파일을 호출하는 것 외에는 무시할 방법이 없습니다.

+0

'ZipFile.write'에 대한 문서를 확인하십시오. 그것들은 파일 이름이 아니라 파일 내용입니다. OP가 기존 목록을 반복하고 있습니다 ... – tdelaney