본 게시물은 한빛미디어의 <머신러닝 시스템 설계>를 참고하여 작성하였습니다.
프로그래머스의 과제테스트 연습 중 연습과제에서 [실무 역량 과제] 데이터 분석 및 조작에서 json 파일로 핸들링하는 과정에서 json 파일에 있는 각 프로퍼티에 접근해서 조건에 맞는 프로퍼티*(property) 객체에 있는 값을 조건으로 확인하고 가져오는 그런 과제가 있었다.
일단 나는 pandas의 데이터프레임을 다루는 것이 훨씬 익숙해서, 판다스 모듈을 불러와서 핸들링 했는데, vs code 자체에서 모듈이 안깔려있어서, 그냥 json 자체로 핸들링했어야 했다.
사실 json이라는 게 어떻게 생겼는지는 알긴 하고, 개발하면서 json 타입으로 바꿔서 request, response는 했지만 제대로 Json이 반정형 데이터라는거 그이상 그이하는 모르고 있었는데, 옆자리 개발자가 해당 책을 추천해주면서 이 부분 공부하라고 해서 지금 하는 중임.. 고맙다 따봉 재호야
*property (프로퍼티) : 기본적으로는 어떤 값이나, 이 값이 다른 값과 연관되어 있을 때 property 라고 부름
예를 들어 문자열에는 lenght라는 property가 포함되어 있는데, 이 property는 문자열 안에 있는 문자의 양을 정수로 나타낸 값을 담고 있음
MDN(https://developer.mozilla.org/ko/docs/Glossary/property/JavaScript)
에서는 property가 데이터 구조와 연관된 속성을 나타내고, (1) 인스턴스 프로퍼티(Instance Property), (2) 정적 프로퍼티(Static Property) 두 종류로 나눠진다고 한다.
참조 : https://blog.naver.com/magnking/220966405605
*search와 retrieval 은 '검색' 이지만 두 용어는 엄밀히 말하자면 다르다고 함
'search'는 검색 엔진에서 키워드와 관련된 정보를 찾는 프로세스고, 'retrieval'은 이미 데이터베이스나 스토리지에 저장되거나 색인된 정보에 액세스하는 프로세스임
ML 시스템은 다양한 소스에서 온 데이터로 작동하므로, 데이터마다 특성/목적/처리방법이 다르고 데이터 소스를 파악하면 데이터를 보다 효율적으로 사용할 수 있다.
대표적인 데이터 소스는 사용자가 명시적으로 입력하는 사용자 입력 데이터(user input data)
로 텍스트, 이미지, 비디오, 업로드된 파일이다.
user input data
는 철저한 검사와 처리가 필요하다.다른 소스는 시스템 생성 데이터(system-generated data)
로, 시스템의 여러 구성 요소에서 생성되며 구성 요소는 다양한 로그와 모델 예측 같은 시스템 출력이 있다.
이외에 회사의 서비스 및 엔터프라이즈 애플리케이션에서 생성된 내부 데이터베이스
로, 재고/고객 관계/자산 등을 관리하고, ML 모델에서 직접 사용되거나 ML 시스템의 다양한 구성 요소에서 사용된다.
또한 서드 파티 데이터
가 있다. 퍼스트 파티 데이터는 회사에서 사용자 또는 고객에 대해 이미 수집하고 있는 데이터, 세컨드 파티 데이터는 다른회사에서 자체 고객에 대해 수집하는 데이터로 제공받으려면 비용을 지불해야 하는 단어이다.
이 책에서는 고려해야할 질문으로
(1) 멀티모달(multimodel) 데이터, 즉 이미지와 텍스트를 모두 포함하는 데이터는 어떻게 저장할 것인지?
(2) 저렴하고 빠르게 액세스하려면 데이터를 어디에 저장해야 하는지?
(3) 복잡한 모델을 다른 하드웨어에서 올바르게 로드하고 실행하려면 어떻게 저장해야 하는지?
를 말하고 있다.
데이터 직렬화(data erialization)
라고 하는데, 이러한 직렬화 포맷은 매우 다양하다.JSON
행 우선 포맷 vs 열 우선 포맷
- CSV(Comma-separated values) 와 파케이의 비교
■ CSV는 행 우선으로, 행의 연속 요소가 메모리에 나란히 저장되고, 파케이는 열 우선으로 열의 연속 요소가 메모리에 나란히 저장된다.
예를 들어, 데이터셋에 샘플 1,000개가 있고, 각 샘플이 feature를 10개를 가지고 있을 때에 CSV 같은 행 우선 포맷은 샘플에 액세스(오늘 수집된 모든 샘플 액세스), 파케이 같은 열 중심 포맷은 featue에 액세스(모든 샘플의 타임스탬프에 액세스) 하는 것이 좋다.
■ 열 기반 포맷을 사용하면, 데이터가 수천개의 피처로 대용량일 때 효율적인데, 예를 들어 승차 공유(ride-sharing) 트랜잭션 데이터에 feature가 1,000개가 있고, 시간/위치/거리/가격 등 4가지 feature만을 원할 때, 열 우선 포맷은 각 피처에 해당하는 열 4개를 직접 읽지만 행 우선 포맷은 행의 크기를 모르는 경우 모든 열을 읽은 다음 네 열로 필터링한다.
행 크기를 안다고해도 캐싱을 활용할 수 없고 메모리 안에서 이동해야 하므로 느리다.
■ 그러나, 행 우선 포맷을 사용하면 더 빠른 데이터 쓰기가 가능한데, 데이터에 새로운 예제를 계속 추가해야하는 상황이면, 행 우선 포맷 파일에 쓰는 편이 빠르다.
■ 대체로 쓰기를 많이 수행하면 행 우선 포맷, 읽기를 많이 수행하면 열 우선 포맷이 낫다.
** 넘파이(Numpy) 와 판다스(Pandas)
판다스(Pandas)는 열 포맷 중심
이다.
판다스는 '데이터프레임(DataFrame)'을 기반으로 구축 됐고, 행과 열이 있는 2차원 테이블이다.
넘파이는 행 우선인지 열 우선인지 지정할 수 있으며, ndarray가 생성될때 순서를 지정하지 않으면 기본적으로 행 우선이 된다.
CSV와 JSON은 텍스트 파일인 반면 파케이 파일은 이진 파일임
텍스트 파일은 일반 텍스트 파일로 사람이 읽을 수 있지만, 이진 파일은 텍스트가 아닌 모든 파일을 지칭하며, 원시 바이트를 해석하는 방법을 알고 있는 프로그램에서 읽거나 사용하기 위한 파일임
이진 파이른 간결하고 텍스트 파일에 비해 공간을 절약함
예를 들어 숫자 1000000을 텍스트 파일에 저장하면 일곱 글자이고, 각 문자가 1바이트면 7바이트가 필요함. 반면에 int32로 저장하면 32비트, 즉 4바이트만 차지함
AWS는 파케이 포맷을 사용하기를 권장하는데, 파케이 포맷은 텍스트 포맷에 비해 언로드 속도가 최대 2개 빠르고, 아마존 S2에서 최대 6배 적은 스토리지를 사용함
■ 그래프 모델
- 그래프는 노드(node)와 엣지(edge)로 구성되고,
edge는 노드 간의 관계를 나타낸다.
- 그래프 구조로 데이터를 저장하는 데이터베이스를 그래프 데이터베이스라고 한다.
- 문서 데이터베이스에서 각 문서의 내용이 우선이면 그래프 데이터 베이스에서는 데이터 항목 간의 관계가 우선이다.
- 그래프 모델에서는 관계를 명시적으로 모델링하므로, 관계를 기반으로 데이터를 검색하는 것이 빠름
데이터 포맷과 데이터 모델은 사용자가 데이터를 저장하고 검색하는 바업과 관련된 인터페이스를 지정한다.
데이터베이스가 최적화되는 워크로드는 두 가지 유형이 있는데, '트랜잭션 처리'와 '분석 처리' 이다.
2021년 기준 구글 트렌드에 따르면 OLTP와 OLAP는 구식 용어임.
기존의 OTP와 OLAP 패러다임은 스토리지와 처리가 밀접하게 결합되어 있어서, 데이터 저장 방식이 곧 데이터 처리 방식이었다.
오늘날 데이터 세계에서는 데이터가 처리되고 제공되는 속도를 나타낼 때 온라인, 니어라인(nearline), 오프라인 등을 사용한다.
- 온라인 처리 : 데이터를 즉시 입력 및 출력할 수 있음
- 니어라인 : 니어-온라인(near-online) 데이터를 즉시 사용할 수 는 없지만 사람의 개입 없이 빠르게 온라인으로 만들 수 있음
- 오프라인 : 데이터를 즉시 사용할 수 없으며 온라인으로 만드는데 사람의 개입이 필요함
책 내부에 판다스를 이용해서 데이터프레임에 행별로 액세스 한 것, 열별로 액세스한 것에 대한 실행속도가 나오는데, 판다스는 위에서 말한 것 처럼 데이터프레임에 열 우선 포맷이라 행 별로 액세스하면 열 별로 액세스 할 때보다 훨씬 느리다.
이걸 넘파이 배열로 변환하면 액세스 속도는 훨씬 빨라진다.
프로그래머스에서 주어졌던 customer.json 파일을 가지고 한 번 해봤는데
json이 진짜.. 확연히 빠르네 ㅋㅋ ㅅㄱ..
무조건 for문 돌리면 느려질거라고 생각했던 나의 톱밥 같은 생각이었다.
데이터 수가 적어서 유의미한 차이는 보이지 않지만,
수가 늘어나면 실행속도면에서 유의미한 차이가 나지 않을까 ?
암튼.. 열기반, 행기반 ㅇㅋㅇㅋ 알