파이썬 프로그램에서 파일 객체를 읽고 수정하려는 경우 두 가지 방법으로 수행할 수 있습니다. 첫 번째 방법은 파일이 있는 물리적 저장 드라이브의 내용을 수정하는 것이고 두 번째 방법은 시스템의 메모리 또는 RAM에서 직접 수정하는 것입니다. 이 기사에서는 파이썬에서 사용 가능한 mmap 모듈을 사용하여 파일 객체의 내용을 읽고, 검색하고, 수정하는 방법을 볼 것입니다. 파일을 조작하기 위해 열기, 읽기 및 lseek와 같은 시스템 호출을 만드는 대신 메모리 매핑은 파일의 데이터를 메모리에 저장하여 메모리에 있는 파일을 직접 조작할 수 있도록 합니다.
메모리 매핑된 파일 읽기
아래 예제에서 우리는 완전한 파일을 한 번에 메모리로 읽어들여 메모리에 파일 객체로 보관합니다. 그런 다음 읽기 모드에서 액세스합니다. 마지막으로 전체 파일은 필요한 텍스트를 얻기 위해 특정 위치를 슬라이스하는 개체를 나타냅니다.
예시
import mmap def read_mmap(fname): with open(fname, mode="r", encoding="utf8") as fobj: with mmap.mmap(fobj.fileno(), length=0, access=mmap.ACCESS_READ) as mmap_obj: print(mmap_obj[4:26]) read_mmap('E:\\test.txt')
출력
위의 코드를 실행하면 다음과 같은 결과가 나옵니다. -
'emissions from gaseous'
mmap을 사용하여 찾기
예시
import mmap import time def regular_io_find(fname): with open(fname, mode="r", encoding="utf-8") as fobj: text = fobj.read() text.find("Death ") def mmap_io_find(fname): with open(fname, mode="r", encoding="utf-8") as fobj: with mmap.mmap(fobj.fileno(), length=0, access=mmap.ACCESS_READ) as mmap_obj: mmap_obj.find(b"Death ") start_time_r = time.time() regular_io_find('E:\\emissions.txt') end_time_r = time.time() print("Regualr read start time :",start_time_r) print("Regualr read start time :",end_time_r) print('Regular read time : {0}'.format(end_time_r - start_time_r)) start_time_m = time.time() mmap_io_find('E:\\emissions.txt') end_time_m = time.time() print("mmap read start time :",start_time_m) print("mmap read start time :",end_time_m) print('mmap read time : {0}'.format(end_time_m - start_time_m))
출력
위의 코드를 실행하면 다음과 같은 결과가 나옵니다. -
2013 Regualr read start time : 1609812463.2718163 Regualr read end time : 1609812463.2783241 Regular read time to find: 0.00650787353515625 mmap read start time : 1609812463.2783241 mmap read start time : 1609812463.2783241 mmap read time to find : 0.0
파일에 쓰기
아래 예에서 우리는 파일을 가져오고 파일에 대한 읽기와 쓰기를 모두 허용하는 r+로 액세스 코드가 있는 mmap 모듈로 파일을 엽니다. 파일 개체를 만든 후 문자열을 쓸 수 있는 부분을 잘라서 위치를 선택합니다.
예시
import mmap def mmap_io_write(fname): with open(fname, mode="r+") as fobj: with mmap.mmap(fobj.fileno(), length=0, access=mmap.ACCESS_WRITE) as mmap_obj: mmap_obj[20:26] = b"Hello!" mmap_obj.flush() mmap_io_write('E:\\emissions.txt')
위의 코드를 실행하면 파일을 열고 Hello! 문자열을 볼 수 있습니다. 20에서 26까지의 바이트 위치에 파일에 기록됩니다.