지난 시간에 제미나이를 괴롭힌 결과물에는 모르는 용어들이 너무 많았다. 그래서 그 용어들에 내가 알 수 있는 주소를 붙이기로 했다. 이 용어들이 얼만큼의 중요성 있는 용어들인지는 전혀 알 수 없지만, 뉴튼 선생님의 운동역학을 은유적으로 대입했을때 가장 알맞는 용어들이라고 제미나이 선생님이 그랬으니, 믿는다.
<지난시간 복습>
용어의 주소를 찾아가는 길에는 논리적 징검다리가 필요하다.
step1. 변수와 자료형(기초): 데이터를 메모리(RAM)에 잠깐 저장하는 법. 프로그램이 꺼지면 데이터도 사라진다.
step2. 파일 입출력 및 DB(중급): 데이터를 영구적으로 저장하기 위해 하드디스크에 기록한다. 하지만 하드디스크는 메모리에 비해 너무 느리다.
step3. 딕셔너리(dict)의 확장(연결고리): 파이썬의 딕셔너리는 '키-값'쌍으로 데이터를 아주 빠르게 찾는다."Redis"는 이 딕셔너리를 내 컴퓨터 안이 아니라 '네트워크 저 너머 서버'에 통째로 옮겨놓은 것.
"Redis"의 주소: 여러 사람이 동시에 사용하는 웹 서비스에서, 하드디스크(DB)까지 가기엔 너무 느리니까 메모리에 딕셔너리 형태로 데이터를 미리 올려두고 빛의 속도로 꺼내 쓰는 것.
--> 딕셔너리를 배울때 Redis의 개념도 염두에 두자!
[기초] 일반적인 디셔너리 예시
user_cache = {
"user_123":{"name":"alice", "level":50},
"user_456":{"name":"Bob", "level":30}
}
데이터를 찾는 과정
user_id="user_123"
if user_id in user cache:
print(f"데이터 발견:{user_cache[user_id]['name']}")
--> Redis를 쓸때는 위 코드의 User_cache가 내 컴퓨터가 아니라 외부 메모리 서버에 저장되어 있다고 상상하자.
--> 디지털논리회로 과목에서 "BUS"라는 용어가 나오면, "데이터가 이동하는 통로가 좁구나"를 느끼며 왜 데이터를 뭉텅이로 옮겨야 하는지 Redis의 효율성과 함께 이해해보자.
step1. 제어문- for 반복문(기초): 데이터를 하나하나 순서대로 처리하는 법.
step2. 중첩 반복문(기초/중급): 구구단처럼 for문 안에 for문을 쓰는법. 행렬(Matrix) 계산의 기본이죠.
step3. CPU 캐시 메모리의 이해(연결고리): CPU는 일할 때 RAM에서 데이터를 가져오는데, 한 번 가져올 때 근처에 있는 데이터도 뭉텅이로 가져와서 '캐시'라는 아주 좁지만 빠른 공간에 넣어둔다. 만약 우리가 큰 행렬을 계산할 때 너무 멀리 있는 데이터를 자꾸 찾으면, CPU는 캐시를 비우고 다시 RAM으로 가야 해서 느려진다.
"Loop Tiling"의 주소: 데이터를 한 번에 다 처리하려 하지말고, CPU 캐시 크기에 딱 맞는 '타일(조각)' 단위로 쪼개서 그 안에서 계산을 끝내버리는 기법. "왔다 갔다 하는 시간"을 줄이는 최적화.
--> 데이터가 많아지면 Looptiling 같은 방법으로 쪼개서 처리해야겠구나!
[기초] 일반적인 중첩 반복문(전체 다돌기)
date=list(range(100))
for i in range(100):
pass
[심화] 루프 타이링의 논리(10개씩 쪼개서 돌기)
tile_size=10
for i in range(0, 100, tile_size):
for j in range(i, i+tile_size):
pass
--> 디지털논리회로 과목에서 "SRAM, DRAM"이라는 용어가 나온다면, "SRAM(캐시)이 왜 더 빠를까?"를 생각하며 Loop Tiling을 떠올려보자.
용어들이 서말이나 나왔으니 이제 기초과목들을 공부하면서 꿰어야겠다.