# src/point_location.py
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
def location(p: Point) -> str:
"""맵에서 좌표에 해당하는 객체를 검색"""
return f'{p.x, p.y}'
# tests/test_point_location.py
from src.point_location import Point, location
def test_location():
# 포인트 객체 생성
p = Point(1, 2)
# 좌표를 검색하고 결과를 확인
result = location(p)
assert result == "(1, 2)"
# Makefile
# .PHONY는 make 명령어를 실행할 때 해당 명령어를 실행하도록 하는 것
.PHONY: typehint
typehint:
mypy --ignore-missing-imports src/
.PHONY: test
test:
pytest tests/
.PHONY: lint
lint:
pylint src/
.PHONY: checklist
checklist: typehint test lint
.PHONY: black
black:
black -l 79 *.py
.PHONY: clean
clean:
find . -type f -name "*.pyc" | xargs rm -fr
find . -type d -name "__pycache__" | xargs rm -fr
일반적으로는 git과 함께 사용하여 git tag를 통해 대용량 데이터 버전관리를 할 때 유용하게 쓰인다. git에서는 2GB 이상의 데이터를 push할 수 없기 때문에, 대용량 폴더는 dvc로 관리하고 git ignore에 명시하여 git이 추적하지 않도록 한다.
대용량 폴더는 dvc를 이용하여 데이터를 원격저장소에 저장한다. dvc가 관리하는 파일들은 [폴더명.dvc]라는 메타정보파일이 남는다. 이 메타정보 파일에는 원격저장소에 저장된 데이터 경로와 데이터 size, 파일개수가 쓰여있다. git은 이 메타정보 파일을 추적하여 버전관리를 한다.
예시)
Workspace를 보면 train.py, pred.py, data폴더, model폴더가 존재한다. 이 중 data와 model은 대용량폴더이기 때문에 dvc로 관리한다. 그렇게 되면 git repository에는 train.py, pred.py와 data와 model 폴더의 메타정보를 담은 data.dvc, model.dvc 파일이 관리되고, 데이터는 원격저장소로 push되어 원격저장소 내에 저장되어있다. model.dvc 내용을 살펴보면 model의 원격저장소 위치와 size, 파일개수, path 정보가 들어있다. 원격저장소에서 c6/efae81ddbbf2a8a88d6d3790e60e61.dir을 찾아가서 살펴보면 원격저장소 파일경로와 실제파일명이 매칭되어 적혀있다. 10/d2a131081a3095726c5721ed31c21f의 내용을 확인하면 Workspace/model/model1.pt 파일내용을 볼 수 있다
dvc는 왜 파일을 이렇게 복잡한 파일명으로 관리하는걸까? dvc는 해시값을 이용하여 데이터를 관리한다. 해시값이란 파일의 데이터를 해시 함수(Hash Funtion) 또는 해시 알고리즘(Hash Algorithm)을 통해 계산하여 산출된 값으로 이러한 값은 해당 파일의 고유한 값이다. 해시값은 고유한 값이기 때문에 두 파일의 해시값이 같다는 것은 두 파일이 동일한 파일임을 의미한다. 해시값을 이용하여 데이터를 저장하면 동일한 파일을 중복저장하지 않을 수 있다. 파일명만 다르고 내용이 동일한 파일이 있는 경우, 데이터는 한 번만 저장되고 동일한 해시 값을 참조한다.
# 원격 저장위치 설정
# model 내용을 두 개의 원격저장소에 push해보기
dvc remote add aimodel C:\Users\stone\seokhwa_practice\DVC\aimodel
# 원격저장소 config git add
git add .dvc/config
git commit -m "Configure remote storage"