python mmap

About_work·2023년 3월 28일
0

메모리와 디스크

목록 보기
1/1

disk vs memory

mmap의 장점

  • 메모리 매핑된 데이터는 디스크에서 직접 읽어오므로, 디스크에서 메모리로 데이터를 복사할 필요가 없습니다. 이를 통해 I/O 오버헤드를 줄일 수 있습니다.
  • 메모리 매핑된 데이터는 bytes 객체와 같이 다룰 수 있으며, 파일을 읽고 쓰는 과정에서 발생하는 버퍼링 등의 오버헤드도 줄일 수 있습니다.
  • 매핑된 데이터는 디스크 데이터와 동기화되므로, 메모리에서 수정한 데이터가 디스크에 자동으로 반영됩니다.
  • 메모리 매핑된 데이터는 일반적인 bytes 객체와 같이 다룰 수 있으므로, 메모리 상의 데이터를 수정하는 작업이 간단합니다.

mmap의 단점

  • 메모리 매핑된 데이터는 파일 크기보다 커지면 메모리 부족 오류가 발생할 수 있습니다.
  • 메모리 매핑된 데이터를 수정할 때, 데이터의 일부만 수정하는 경우 디스크 데이터가 깨질 수 있습니다. 이를 방지하기 위해서는 수정할 데이터를 전체적으로 읽어서 수정한 후, 다시 파일에 써야 합니다.
  • 메모리 매핑된 데이터를 이용하는 경우, 파일을 수정하면 매핑된 메모리에 대한 포인터가 변경되므로, 수정된 데이터에 대한 포인터를 다시 찾아야 하는 번거로움이 있습니다.

직접 디스크 데이터를 읽고 쓰는 것의 장점

  • 메모리 부족 문제가 발생하지 않습니다.
  • 파일을 수정하는 경우, 데이터를 직접 읽어와서 수정할 수 있으므로, 수정한 데이터에 대한 포인터를 찾을 필요가 없습니다.

직접 디스크 데이터를 읽고 쓰는 것의 단점

  • 파일을 읽고 쓰는 과정에서 I/O 오버헤드가 발생합니다.
  • 파일을 읽고 쓰는 과정에서 버퍼링 등의 오버헤드가 발생할 수 있습니다.
  • 파일을 수정하는 경우, 수정된 데이터를 다시 파일에 쓰는 과정에서 데이터를 복사해야 하므로, I/O 오버헤드가 발생할 수 있습니다.

내용

  • 디스크에 저장된 데이터를 메모리에 매핑시켜주는 기능을 제공합니다.

  • 이를 통해, 파일에서 데이터를 읽고 쓰는 과정에서 발생하는 I/O 오버헤드를 줄일 수 있습니다.

  • mmap 모듈은 파이썬에서 메모리 매핑(memory mapping)을 수행하는 모듈입니다.

  • 메모리 매핑은 파일이나 기타 객체의 일부를 메모리에 매핑하여 읽고 쓸 수 있도록 해주는 기술입니다.

  • 메모리 매핑은 매우 큰 파일이나 네트워크 연결, 빅 데이터 처리 등에서 매우 유용합니다.

  • mmap 모듈의 mmap() 함수는 파일이나 기타 객체를 메모리에 매핑하는 함수입니다.

    • 이 함수는 파일 객체나 파일 디스크립터, 또는 기타 객체를 인자로 받습니다.
    • 매핑된 메모리는 바이트열 형태로 반환되며, 이를 bytes, bytearray 또는 memoryview 객체로 변환하여 사용할 수 있습니다.
  • 메모리 매핑된 데이터를 수정하면, 매핑된 파일이나 객체도 함께 수정됩니다.

    • 따라서, 메모리 매핑은 기존 파일이나 객체를 변경하지 않고도 데이터를 수정할 수 있는 방법입니다.
  • 예시로, 다음과 같이 파일을 열고 mmap() 함수를 사용하여 파일의 내용을 메모리에 매핑할 수 있습니다.

import mmap

# 파일 열기
with open("file.txt", "r+") as f:
    # 파일 내용 메모리 매핑
    #
    mm = mmap.mmap(f.fileno(), 0)
    
    # 매핑된 데이터 읽기
    data = mm.readline()
    print(data)
    
    # 매핑된 데이터 수정
    mm[0] = b"X"
    
    # 매핑된 데이터 쓰기
    mm.write(b"Hello World")
    
    # 메모리 매핑 종료
    mm.close()
  • mmap 모듈은 파일이나 기타 객체의 내용을 메모리에 매핑하여 데이터를 빠르게 읽고 쓸 수 있게 해주므로, 대용량 파일이나 네트워크 연결, 빅 데이터 처리 등에서 유용하게 사용될 수 있습니다.
  • 하지만, 메모리 매핑은 주의해서 사용해야 하며, 메모리 매핑된 데이터를 수정하면 매핑된 파일이나 객체도 함께 수정된다는 점을 유의해야 합니다.

f.fileno()

  • f.fileno()는 파일 객체 f의 파일 디스크립터(file descriptor)를 반환하는 메서드입니다.

  • 파일 디스크립터는 파일을 식별하기 위한 유일한 정수값으로, 파일 시스템에서 파일을 관리하기 위해 사용됩니다.

  • 파일 디스크립터는 일반적으로 파일을 열 때 운영체제에서 할당됩니다.

  • 따라서 파일을 열 때마다 파일 디스크립터는 다른 값이 됩니다.

  • fileno() 메서드를 사용하면 파일 객체의 파일 디스크립터를 가져올 수 있으며, 이를 이용하여 파일의 데이터를 다룰 수 있습니다.

  • 예를 들어, mmap 모듈에서 mmap() 함수는 파일 디스크립터를 이용하여 파일의 데이터를 메모리에 매핑합니다.

  • fileno() 메서드는 파일 객체가 닫혀 있지 않은 경우에만 사용할 수 있습니다.

  • 따라서, 파일을 사용한 후에는 반드시 close() 메서드로 파일 객체를 닫아주어야 합니다.

  • 파일 객체가 닫힌 이후에는 fileno() 메서드를 호출할 수 없으며, ValueError 예외가 발생합니다.

profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글