포시코딩

1월18일 - reversed, map 본문

TIL

1월18일 - reversed, map

포시 2023. 1. 18. 11:58
728x90

데이터베이스 심화

자신이 데이터베이트 엔진을 만드는 프로그래머일 때 이중화 기능을 어떻게 구현해볼지

검색 없이 생각해오라는 과제를 받았었고, 

 

이에 대해 다음과 같이 생각해보았다.

 

먼저, 두개의 프로세스로 나눈다.

  1. 마스터와 스탠바이의 싱크 맞추기
  2. 마스터 터졌을 때 스탠바이로 넘겨주는 방법

1. 싱크는 a 폴더의 카피본인 a' 폴더에 대해 리눅스에서 cp 하듯 처리하면

a'에 없는 파일만 옮겨진다거나 a'에만 있는 파일은 삭제되는 명령어가 있는걸로 기억하는데

이 명령어를 마스터에 write/update/delete가 있을 때마다 아니면 일정시간마다 수행되게 한다.

-> 근데 지금 작성하며 생각해보니 이 방법은 하나의 같은 pc 안에서나 가능하고

두 서버가 물리적으로 다르다면 불가능할 것이므로 다른 방법이 필요해보인다.

 

2. ping과 같은 느낌으로 기존 마스터 디비 서버에 연결 상태를 확인하다가 일정 시간이나 횟수에 응답하지 않을 경우

스탠바이 서버를 바라보게 바꾼다.

 

아래는 튜터님이 했던 방법을 소개해줬다.

 

AWS의 PIT 리커버리로 매 1분마다 롤백하는 방법도 있고

트랜잭션 로그를 워칭하는 시스템을 만들어 append를 계속 해서 싱크를 맞추는 방법이 있다.

후자의 경우 write operation 등에 대해 트랜잭션이 완료되고 업데이트 되는 순간 싱크를 받는 방식

하지만 워낙 write가 많은 상황일 경우 즉, 트랜잭션 로그 쌓이는게 싱크되는거 보다 빠를 경우

트랜잭션이 완료되길 마냥 기다리기 보단 오프셋을 걸어 처리하는 방식으로 진행된다고 한다.

 

Python

reversed

거꾸로 for문을 돌릴 수 있다.

a = [1, 2, 3, 4, 5]

for x in a:
  print(x)
# 1
# 2
# 3
# 4
# 5

for x in reversed(a):
  print(x)
# 5
# 4
# 3
# 2
# 1

참고로 range를 이용해

for x in range(len(a)-1, -1, -1):
    print(a[x])

이처럼 나타낼 수도 있으나 -1이 반복되는 위 코드는 가독성면에서 별로 좋지 않은 코드라고 한다.

for x in a[::-1]:
    print(x)

또한 이렇게도 쓸 수 있는데

일단 위 두 for문과 reversed를 쓰는 것의 차이점은

reversed는 주어진 자료구조에 담긴 원소들을 역순으로 순회할 수 있게 반복자(iterator)를 결과값으로 반환하는데

a = [1, 2, 3, 4, 5]

b = reversed(a)
print(b)

print(next(b))  # 5
print(next(b))  # 4
print(next(b))  # 3
print(next(b))  # 2
print(next(b))  # 1

이처럼 반복자는 미리 메모리에 모든 원소를 올려놓지 않고 필요할 때마다 원소를 하나씩 제공해줘서

for문으로 루프를 돌릴 때 보다 메모리 사용량 측면에서 큰 이점이 있다.

 

map

map(함수, 반복 가능한 자료형)

map은 위와같이 사용이 가능하다.

a = [1, 2, 3, 4, 5]

result = list(map((lambda x: x + 1), a))
print(result)

보통은 이런 형태로 쓰이며 lambda 대신 만들어놓은 함수가 들어가도 되며

map은 map 객체로 반환되기 때문에 list로 감싸서 사용하는 것을 자주 확인할 수 있다.

728x90

'TIL' 카테고리의 다른 글

1월20일 - 오버로딩(overloading)  (0) 2023.01.20
1월19일 - Sequelize Transaction  (0) 2023.01.19
1월17일  (0) 2023.01.18
1월16일 - session, jwt, OAuth  (0) 2023.01.16
1월15일  (0) 2023.01.15