728x90
반응형
SMALL

대용량 파일을 읽기 위해서는 다양한 방법들이 있는데, 그중에서 메모리 매핑을 통하여 빠르게 접급하는 방법에 대해서 알아 보자.

 

먼저 예제 코드는 아래와 같다.

import mmap

def process(data):
	# 데이터 처리 로직
    pass

with open('large_file.txt', 'r+b') as f:
    mm = mmap.mmap(f.fileno(), 0)
    while True:
        line = mm.readline()
        if not line:
            break
        # 각 줄에 대한 처리
        process(line)
    mm.close()

 

첫줄에 mmap 를 사용할 것이라고 선언(import) 을 하는데 mmap 는 메모리 매핑(memory mapping)을 수행하는 모듈입니다. 장점은 메모리에 매핑된 데이터를 디스크에서 직접 읽어오기 때문에 디스크에서 메모리로 데이터 복사가 없습니다. 그러므로 대용량 처리를 가능하게 합니다.

 

그리고 open() 함수를 이용하여 파일 열기를 수행합니다.

 

다음으로 mmap()와 fileno() 함수를 이용하는데 이는 파일이 가지고 있는 식별자 즉 id(또는 파일 디스크립터)를 메모리에 연결시킵니다.

** 디스크립터(식별자 또는 id)는 파일이 열 때 운영체제로 부터 자동으로 할당되어짐

 

이제 디스크에 저장된 파일과 메모리 연결이 완료되었으니 readline()을 이용하여 한줄씩 접근하고 처리합니다.

 

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

애니메이션 이미지는 여러개의 이미지가 겹쳐진 gif 포맷으로 되어 있다

그 이미지를 파이썬에 적용하기 위해서는 gif 가 몇장의 이미지로 구성되어 있는지 확인을 해야한다.

[gif png, jpg 이미지 추출 방법]

gif 읽기 방법은 gif 의 이미지들 모두 읽어서 각각 리스트에 저장하고

 

다음 이미지를 한장씩 보여주면서 애니메이션이 재생되는 방식이다.

 

그래서 리스트에 gif 에 포함된 모든 이미지를 저장하고 index를 증가시키면서 다음이미지를 보여준다.

 

for 문과 PhotoImage 함수를 이용하여 gif 파일 안에 이미지를 하나씩 읽어 올 수 있다. 이때 중요한 부분은 format 설정임(아래 코드 참조)

 

dragon-gif.gif
0.43MB

 

from tkinter import * # tkinter에서 모든 정의를 임포트한다.


class LoadGIFImage:
	def __init__(self):
		window = Tk() # 윈도우 생성
		window.title("GIF Image Example") # 제목을 설정
		window.geometry("640x480") # 윈도우 크기 설정
		window.resizable(0,0)        
		self.canvas = Canvas(window, bg = "white")
		self.canvas.pack(expand=True,fill=BOTH)	
		
		self.my_image_number = 0 
		#마지막 range(60) 에서 60 은 gif 이미지 수를 나타냄
		#gif 파일의 이미지를 한장씩 읽고 리스트에 저장함
		self.myimages = [PhotoImage(file='dragon-gif.gif',format = 'gif -index %i' %(i)) for i in range(60)]
		
		
		#아래 코드에서 subsample(2) 는 이미지 크기를 작게함. 인수 값에 따라 작아짐
		#self.myimages = [PhotoImage(file='dragon-gif.gif',format = 'gif -index %i' %(i)).subsample(1) for i in range(60)]

		#이미지를 canvas에 그리고 id 값을 생성후 self.dragon 변수에 저장
		self.dragon = self.canvas.create_image(300,240, image = self.myimages[0],tags="dragon")

		self.canvas.create_text(320,360,font="Times 15 italic bold",text="Load GIF Image")

		while True:

			#canvas에서 self.dragon 이미지를 읽어오고 gif의 다음 이미지로 교체함
			self.canvas.itemconfig(self.dragon, image = self.myimages[self.my_image_number%len(self.myimages)])    

			self.my_image_number += 1
			window.after(33)
			window.update()

		#window.mainloop() # 이벤트 루프를 생성한다.


LoadGIFImage() # GUI 생성한다.

 

728x90
반응형
LIST

+ Recent posts