Crawling
- 웹사이트에 있는 데이터를 사용하기 위해 홈페이지 내용을 수집하고 추출하는 것
- http 요청을 보내고 응답으로 받은 페이지를 분석해 필요한 데이터만 추출
cheerio
, Puppeteer
, Selenium
, BeautifulSoup
등의 라이브러리를 사용해서 크롤링 가능
- 검색 엔진에 사용 - 웹 크롤러가 수집한 데이터에 검색 알고리즘을 적용해 사용자의 검색에 대한 응답으로 관련 링크를 제공
1. 대상 선정
- 웹 상의 고유한 ID인
URI
가 존재 → 보통 URL
URI
- 특정 리소스를 식별하는 통합 자원 식별자(Uniform Resource Idenrifier)
- 논리적 또는 물리적 리소스를 식별하는 고유한 문자열 시퀀스
URL
- 웹 주소로 컴퓨터 네트워크 상에서 리소스가 어디에 있는지 알려주기 위한 규약
- URI
의 서브셋
→ URI는 식별하고 URL은 위치를 가리킨다
2. 데이터 로드
- API인 경우
XML
, JSON
형식의 데이터
- 웹 페이지인 경우
HTML
형식의 데이터
3. 데이터 분석
- 로드된 데이터에서 필요한 부분을 뽑아낸다
- 필요한 부분은 수집하고, 필요하지 않은 부분은 수집하지 않도록 선정
4. 수집
- 데이터 분석을 통해 수집할 내용을 선정한 후 데이터를 추출해 메모리 상에 저장
Cache
- 자주 사용하는 데이터나 값을 저장해놓는 임시 장소로 계산이나 접근 시간을 줄이기 위한 저장소
- 공간이 부족할 경우 우선순위가 낮은 데이터를 교체
Cache Hit
: 참조하고자 하는 데이터가 캐시에 존재하는 경우
Cache Miss
: 참조하고자 하는 데이터가 캐시에 존재하지 않는 경우
comlulsory miss
: 해당 메모리 주소가 처음 요청되어 발생하는 miss
conflict miss
: A와 B가 같은 캐시 메모리 주소에 할당되어 발생하는 miss, 캐시 공간이 남는데도 주소 할당으로 발생하는 miss
capacity miss
: 메모리 공간이 부족해서 나는 miss
캐시 배치 정책
Directed Mapped Cache
- 가장 기본적인 캐시 배치 정책으로 DRAM의 여러 주소가 캐시 메모리의 한 주소에 대응되는 N:1 방식
- 예시 그림에서는 캐시 메모리 하나 당 DRAM 4개의 주소에 대응
- 앞부분 일부는
Tag Field
, 끝부분 일부는 Index Field
Index Field
를 사용해 캐시 메모리 주소에서 데이터 참조
→ Conflict miss
발생 가능
Fully Associative Cache
- 캐시 메모리 주소 중 비어있는 곳에 데이터 할당
→ 저장이 간단하고 Conflict miss
가 발생하지 않지만 원하는 데이터를 찾기까지 tag bit
를 일일이 비교해야하기 때문에 시간이 오래 걸릴 수 있다
Set Associative Cache
Directed Mapping
+ Fully Associative Mapping
- cache의 몇 개의 block을 묶어 하나의
set
으로 구성 → cache는 여러 개의 set으로 구성
- 하나의 set이 2개의 block으로 이루어져 있으면
2-way set associative cache
, 하나의 set이 3개의 block으로 이루어져 있으면 3-way set associative cache
→ Direct Mapping보다 검색은 느리지만 저장이 빠르고, Fully Associative Mapping보다 저장은 느리지만 검색이 빠르다
캐시 쓰기 정책
언제 메인 메모리의 값을 변경할 것인가에 대한 정책
캐시 Hit 시 쓰기 정책
Write Through
- 쓰기 동작 시 주 기억장치와 캐시의 메모리 값을 동시에 변경
→ 구조가 단순하고 일관성이 있지만 항상 메인 메모리에 접근하기 때문에 속도 문제
Write Back
- 캐시에서만 메모리 값을 변경하고 해당 주소의 데이터가 바뀔 때만 메인 메모리에 복사
→ 속도가 빠르지만 일관성 문제
캐시 Miss 시 쓰기 정책
Write-Allocate
No Write-Allocate
캐시 교체 정책
FIFO(First In First Out)
- 캐시 공간이 모자란 경우 처음 캐시에 올라온 데이터를 교체
→ 잦은 교체 문제
LRU(Least Recently Used)
- 캐시 공간이 모자란 경우 가장 오래동안 사용하지 않은 데이터를 교체
- 자리가 없는 경우 가장 앞에 위치한 데이터를 삭제하고 새로운 데이터를 뒷부분에 입력
- 주로
Double Linked List
를 사용해 head에 가까울수록 오래된 데이터, tail에 가까울수록 최근에 사용된 데이터 → 시간복잡도가 O(1)
LFU(Least Frequently Used)
- 캐시 공간이 모자란 경우 사용 횟수가 가장 적은 데이터부터 교체
- 교체 대상이 여러 개면 LRU 알고리즘을 따름
→ 최근에 적재된 데이터가 교체될 수 있고 초반에 집중적으로 사용되고 사용되지 않는 데이터로 인해 메모리 낭비 문제
참고자료
https://www.charlezz.com/?p=44767
http://itnovice1.blogspot.com/2019/01/web-crawling.html
https://slidetodoc.com/memory-systems-chapter-12-memory-hierarchy-cache-memory/
https://velog.io/@khsfun0312/캐시-정책알고리즘
https://medium.com/pocs/페이지-교체-page-replacement-알고리즘-650d58ae266b