Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python(mmap)에서 메모리 매핑된 파일 지원?

<시간/>

파이썬 프로그램에서 파일 객체를 읽고 수정하려는 경우 두 가지 방법으로 수행할 수 있습니다. 첫 번째 방법은 파일이 있는 물리적 저장 드라이브의 내용을 수정하는 것이고 두 번째 방법은 시스템의 메모리 또는 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까지의 바이트 위치에 파일에 기록됩니다.