Python 순환 읽 기 데이터 메모리 부족 해결 방안
import gc
for x in list(locals().keys())[:]:
del locals()[x]
# del all_s_x, AE, AE_split, x_ticks, split
gc.collect()
추가:Python 에서 큰 파일 을 읽 는"구덩이"와 메모리 사용량 검사python 이 파일 을 읽 고 쓰 는 api 는 모두 간단 해서 주의 하지 않 으 면'구덩이'를 밟 기 쉽다.필 자 는 구 덩이 를 밟 는 과정 을 기록 하고 정 리 를 해 주 었 습 니 다.여러분 이 python 을 사용 하 는 과정 에서 위험 이 발생 할 수 있 는 코드 를 피 할 수 있 기 를 바 랍 니 다.
1.read()와 readlines():
python 에서 파일 을 읽 고 쓰 는 강 좌 를 검색 하면 read()와 readlines()라 는 함 수 를 자주 볼 수 있 습 니 다.그래서 우 리 는 다음 과 같은 코드 를 자주 볼 수 있다.
with open(file_path, 'rb') as f:
sha1Obj.update(f.read())
or
with open(file_path, 'rb') as f:
for line in f.readlines():
print(line)
이 방법 은 작은 파일 을 읽 을 때 확실히 이상 이 없 지만 큰 파일 을 읽 으 면 메모리 오류,즉 메모리 가 넘 치 는 문제 가 발생 하기 쉽다.Why Memory Error?
우 리 는 먼저 이 두 가지 방법 을 살 펴 보 자.
기본 매개 변수 size=-1 일 때 read 방법 은 EOF 까지 읽 습 니 다.사용 가능 한 메모리 보다 파일 크기 가 클 때 메모리 가 넘 치 는 오류 가 발생 합 니 다.
마찬가지 로 readlines 는 list 를 구성 합 니 다.iter 가 아 닌 list 이기 때문에 모든 내용 이 메모리 에 저장 되 고 메모리 가 넘 치 는 오류 가 발생 할 수 있 습 니 다.
2.정확 한 용법:
실제 실행 되 는 시스템 에서 상기 코드 를 쓰 는 것 은 매우 위험 하 다.이런'구덩이'는 매우 은밀 하 다.그래서 다음 에 정확 한 사용 방법 도 간단 하 다 는 것 을 알 아 보 겠 습 니 다.API 에서 함수 에 대한 설명 에 따라 대응 하 는 인 코딩 을 하면 됩 니 다.
바 이 너 리 파일 이 라면 다음 과 같은 쓰기 방법 을 추천 합 니 다.버퍼 가 몇 바이트 인지 스스로 지정 할 수 있 습 니 다.분명히 버퍼 가 클 수록 읽 기 속도 가 빠르다.
with open(file_path, 'rb') as f:
while True:
buf = f.read(1024)
if buf:
sha1Obj.update(buf)
else:
break
텍스트 파일 이 라면 readline 방법 이나 직접 파일 을 교체 할 수 있 습 니 다.필 자 는 3G 파일 에서 대략 성능 이 전자 와 20%차이 가 났 다 는 것 을 간단하게 테스트 했다.
with open(file_path, 'rb') as f:
while True:
line = f.readline()
if buf:
print(line)
else:
break
with open(file_path, 'rb') as f:
for line in f:
print(line)
3.메모리 검사 도구 에 대한 설명:python 코드 의 메모리 점용 문제 에 대해 코드 에 대한 메모리 모니터링 이 필요 합 니 다.여기 서 필 자 는 python 코드 의 메모리 사용량 을 측정 하기 위해 두 개의 작은 도 구 를 추천 합 니 다.
memory_profiler
우선 pip 로 memory 설치profiler
pip install memory_profiler
memory_proleer 는 python 의 장식 기 를 이용 하여 작업 하기 때문에 테스트 를 진행 하 는 함수 에 장식 기 를 추가 해 야 합 니 다.
from hashlib import sha1
import sys
@profile
def my_func():
sha1Obj = sha1()
with open(sys.argv[1], 'rb') as f:
while True:
buf = f.read(10 * 1024 * 1024)
if buf:
sha1Obj.update(buf)
else:
break
print(sha1Obj.hexdigest())
if __name__ == '__main__':
my_func()
이후 코드 를 실행 할 때**-m memoryprofiler**함수 의 모든 코드 의 메모리 사용량 을 알 수 있 습 니 다.
guppy
그대로 조롱박 을 그 려 도 pip 를 통 해 먼저 guppy 를 설치 합 니 다.
pip install guppy
이후 코드 에서 guppy 를 이용 하여 각종 python 형식(list,tuple,dict 등)에 대응 하 는 대상 을 각각 얼마나 만 들 었 는 지,얼마나 많은 메모 리 를 차지 하 는 지 직접 출력 할 수 있 습 니 다.
from guppy import hpy
import sys
def my_func():
mem = hpy()
with open(sys.argv[1], 'rb') as f:
while True:
buf = f.read(10 * 1024 * 1024)
if buf:
print(mem.heap())
else:
break
다음 그림 에서 보 듯 이 메모리 사용량 데 이 터 를 출력 할 수 있 습 니 다.상기 두 가지 도 구 를 통 해 guppy 와 memoryproleer 는 python 코드 가 실 행 될 때의 메모리 점용 문 제 를 잘 감시 할 수 있 습 니 다.
4.소결:
python 은 간결 함 을 숭상 하 는 언어 이지 만 간결 함 때문에 오히려 곰 곰 이 생각 하고 생각해 야 할 세부 사항 이 많아 졌 다.여러분 들 이 일상적인 업무 와 학습 에서 도 세부 사항 을 많이 정리 하고 불필요 한'구덩이'를 적 게 밟 기 를 바 랍 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.