일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- pos_tag
- ML
- stopwords
- category_encoders
- SMTP
- 파일입출력
- Trouble shooting
- find_all()
- Logistic linear
- 잡담
- pandas
- 머신러닝
- 트러블슈팅
- auc
- 인공지능
- Roc curve
- 이것이 코딩 테스트다
- IOPub
- 그리디
- 크롤링
- Django
- json
- PYTHON
- beautifulsoup
- EarlyStopping
- aof
- selenium
- 원소주
- semi-project
- AI
Archives
- Today
- Total
개발 블로그
Python hashlib 라이브러리로 파일 읽어서 hash 구하기(파일을 끊어서 읽는 이유) 본문
Programming Language/Python
Python hashlib 라이브러리로 파일 읽어서 hash 구하기(파일을 끊어서 읽는 이유)
draidev 2024. 2. 6. 19:49파이썬에서 hashlib 라이브러리를 사용하여 파일 hash를 구할 수 있다.
import hashlib
def file_to_md5(self):
hash_md5 = hashlib.md5()
with open(self.filepath, 'rb') as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
위와 같이 md5 hash를 구하는 코드예제를 보면 파일을 4096바이트씩 끊어서 읽고 hash를 update하다가 b"" (파일의 끝) 를 만나면 종료되는 것을 볼 수 있다.
이때 왜 f.read()를 안하고 4096 또는 1024와 같이 끊어서 읽는 코드 예제들이 많은지 궁금해서 ChatGPT한테 물어봤다.
결론부터 얘기하면, 대용량 파일을 읽게되는 경우 f.read()로 파일을 읽어오는 작업이 메모리를 과도하게 사용하여 메모리 관련 오류를 발생시킬 수 있기 때문에 이를 방지하고자 파일을 chunk 단위로 끊어서 읽는 것이다. 그 외에도 확장성과 성능에 관련된 이유도 알려준다.
ChatGPT 답변
f.read()로 전체 파일을 한 번에 읽는 대신 f.read(4096)를 사용하여 파일을 청크 단위로 읽는 것은 특히 대용량 파일을 처리할 때 메모리 사용량을 최적화하기 위한 방법입니다. 이 접근 방식이 선호되는 이유는 다음과 같습니다.
1. 메모리 효율성
- 대형 파일: 크기를 지정하지 않고 f.read()를 사용하면 전체 파일을 메모리로 읽어들이려고 시도합니다. 파일이 매우 큰 경우 상당한 양의 메모리를 소비하여 잠재적으로 메모리 오류가 발생하거나 시스템 성능에 영향을 줄 수 있습니다.
- 청크 읽기: 파일을 더 작은 청크(예: 한 번에 4096바이트)로 읽으면 전체 파일을 메모리에 로드할 필요 없이 파일의 각 부분을 순차적으로 처리할 수 있습니다. 이 접근 방식은 특히 대용량 파일의 경우 훨씬 더 메모리 효율적입니다.
2. 확장성
- 임의의 파일 크기 처리: 청크 읽기를 통해 프로그램은 모든 크기의 파일을 일관된 방식으로 처리할 수 있습니다. 파일 크기가 몇 킬로바이트이든 몇 기가바이트이든 상관없이 청크 단위로 읽으면 프로그램이 예측 가능한 메모리 공간을 유지할 수 있습니다.
- 스트림 처리: 이 방법을 사용하면 데이터를 스트림으로 처리할 수도 있으며, 이는 해싱, 데이터 변환 및 실시간 데이터 처리 시나리오에 유용합니다.
3. 성능 고려 사항
- 읽기/쓰기 처리량: 파일을 청크로 읽고 처리하면 특히 디스크 액세스 속도에 병목 현상이 발생하는 시스템에서 디스크 I/O를 최적화할 수 있습니다. 청크 크기를 시스템의 블록 크기 또는 디스크 액세스에 대한 최적의 크기와 일치시키면 더 나은 성능을 얻을 수 있습니다.
- CPU 사용량: 큰 파일을 작은 부분으로 처리하면 프로그램이 전체 파일이 로드될 때까지 기다리지 않고 데이터 처리를 시작할 수 있으므로 CPU 사용량이 더 효율적이 될 수도 있습니다.
'Programming Language > Python' 카테고리의 다른 글
category encoders 설치 과정에서 발생한 에러 (1) | 2024.02.04 |
---|---|
TypeError: dict_to_df() takes 1 positional argument but 2 were given 클래스 함수에서 발생한 에러 (1) | 2024.01.25 |
[Jupyter Notebook] Error : IOPub data rate exceeded. (0) | 2022.04.04 |
[Python] Selenium translation 셀레늄으로 번역기 돌리기 (0) | 2022.03.29 |
[Python] Wordcloud 만들기 (0) | 2022.03.29 |
Comments