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 은 간결 함 을 숭상 하 는 언어 이지 만 간결 함 때문에 오히려 곰 곰 이 생각 하고 생각해 야 할 세부 사항 이 많아 졌 다.여러분 들 이 일상적인 업무 와 학습 에서 도 세부 사항 을 많이 정리 하고 불필요 한'구덩이'를 적 게 밟 기 를 바 랍 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기