정규화와 역정규화
·
Dev
정규화 란? 예시로 학생컬럼이 있으면 a학교 학생1 b학교 학생2 이렇게 되어있는 데이터를 테이블 2개로 만든다(정규화) 테이블1 (학교코드, 학교명 ) 1, a학교 2, b학교 3, c학교 테이블2 ( 학교코드, 학생명 ) 1, 쫑긋 2. 쫑쫑긋 3. 김쫑긋 3. 쫑긋긋 역정규화란 ? 근데 반대로 이걸 역정규화 한다는 말은 a학교, 쫑긋 b학교, 쫑쫑긋 c학교, 김쫑긋 c학교, 쫑긋긋 이렇게 하면 디비관점에서는 index도 느리고, 비대해지는 테이블로 짜증나는 테이블이다. 근데도 일부러 역정규화를 해서 넣는다 단점이 있는데 왜 역정규화를 하나요? 보통은 몇가지의 목적때문에 이런방식을 사용한다 NoSQL 은 대부분 사실상 조인이 불가능해서, NoSQL 스토리지 쓸때는 역정규화를 한다 많은 조인을 하지 않..
zero-copy 대신에 io_uring
·
DATA Engineering/Kafka
Kakfa는 zero-copy 때문에 빠른거 아니였어? 맞다. 근데 이게 속도차이가 엄청 막 별게 아닌것같더라. 그래서 이게 장점인데 막 엄청 장점은 아니라고한다. io_uring 비동기 IO 처리를 위한 리눅스 커널 시스템 콜 인터페이스 라고 보면된다 (read(), write(), send()같은거…) 근데 이걸 잘 써먹고있는게 Netty다 Netty = 프레임 워크 https://netty.io/ 공식적인 설명은 “Netty는 유지 관리 가능한 고성능 프로토콜 서버 및 클라이언트의 신속한 개발을 위한 비동기 이벤트 기반 네트워크 애플리케이션 프레임워크 입니다.” 라고 나와있다 적은 레이턴시, 적은 메모리 소모, 최소화된 불필요한 메모리 복사를 장점으로 뽑고있다 비동기 처리 Netty는 비동기 처리를..
Zero-Copy는 왜 빠를까? (Kafka)
·
DATA Engineering/Kafka
선요약 Kafka는 일반적인 copy 가 아니라 zero-copy를 사용해서 속도가 빠르다 zero-copy는 데이터를 네트워크로 전송할때 생기는 Kernel-Application단에서 생기는 버퍼과정과 복사본 수를 줄이는 기법을 사용했다 NIC버퍼가 Socket버퍼를 거치지않고, Read버퍼에 DMA(직접메모리접근)엔진으로부터 Read버퍼의 내용을 가지는 Descriptor를 가짐으로써 데이터를 읽게된다 zero-copy 과정에서 생기는 버퍼복사는 단 2회 Read(), Send() 등의 시스템 콜에 의해 바뀌는 context-switching(유저모드,커널모드) 에 대한 오버헤드를 줄이고, DMA엔진의 용량보다 데이터양이 더 클때 생기는 미리읽기 성능저하를 방지할수 있음 (기존 copy, 향상된 co..
백준 14888 연산자끼워넣기 파이썬
·
CodingTest
문제 링크 : https://www.acmicpc.net/problem/14888 문제 모든 경우의 수를 구하지않고 하는 방법이 있을까? 이 문제에서는 ‘숫자는 고정' 된 상태에서 ‘연산자 순서를 변경' 해서 최대,최소값을 확인하는것이다 과연 이 문제에서 모든 경우의 수를 구하지않고 하는 방법이 있을까? 쉽지않을것같아서 완탐, BFS, DFS계열로 눈을 돌렸다 굳이 BFS, DFS로 돌려야하나 ? 가만 생각해보니 무조건 모든 연산자를 다 돌려야하는데, 굳이 BFS,DFS로 돌려야 싶었다. BFS나 DFS는 ‘특정 조건이 충족되면 진행' 하는거에 특화되어있는거지, 모든 연산을 확인해야하는 경우에 굳이 써야하는 이유를 모르겠어서 안썻다 완탐 완전탐색. 모든 경우의 수에 하나씩 대입해보면서 결과를 확인한다 연..
백준 11725 트리의 부모 찾기 파이썬
·
CodingTest
링크 https://www.acmicpc.net/problem/11725 문제 DFS DFS의 정의는 깊이우선탐색이며, ‘한 점을 기준으로 파고파고들다가, 끝점에서 다시 복귀하는 과정' 을 거친다는것이 특징이다. BFS에서는 deque()를 써서 구현하지만, DFS에서는 단순 재귀만으로 구현할수 있다. sys.setrecursionlimit(10**7) 재귀방식을 사용하는 DFS의 특성은 Python에서 무한재귀로 빠질 위험이 있다. 따라서 무한재귀를 막기위해, sys.setrecursionlimit(10**7) 를 해주는 것이 일반적이다. DFS(코드) def dfs(v,graph,visit): # print(v) visit[v] = True for i in graph[v] : if visit[i] =..
백준 1260 DFS와 BFS
·
CodingTest
문제 https://www.acmicpc.net/problem/1260 코드(전체) N, M, start = map(int,input().split()) graph = [ [] * i for i in range(N+1) ] for i in range(M) : v1, v2 = map(int, input().split()) graph[v1].append(v2) graph[v2].append(v1) graph = [sorted(x) for x in graph] #print(graph) #DFS def dfs(graph,v, visited) : visited[v] = True print(v, end=' ') for i in graph[v] : if not visited[i] : dfs(graph,i,visite..
도커와 가상환경(VM)의 차이
·
CS지식
선요약 VM은 GuestOS를 각각 할당하고, Docker는 GuestOS를 할당하지않는다. 그러나 프로세스를 돌리기 위해서는 Kernel이 필요한데, VM에서는 각각의 GuestOS를, Docker에서는 공유된 Linuxkernel을 사용한다. 사진에서 보이는 Linuxkernel은 사실 DockerEngine이고, DockerEngine은 VM이라서 OS를 가질수있다(LinuxOS를 사용한다) Linuxkernel의 controlgroups && namespace기능으로 가상의 벽을 만들어서, DockerContainers은 각각의 프로세스를 가졌다. Virtual Machine (가상환경) 가상화 기술은 대체로 하이퍼바이저 기반의 가상화방식을 사용한다. 하이퍼바이저는 논리적으로 분할된 공간에서, V..
캐시메모리가 빠른 이유
·
CS지식
캐시메모리 캐시메모리(Cache Memory)는 속도가 빠른장치(CPU)와 느린장치(메모리)간의 속도차에 의한 병목현상을 줄이기 위한 범용메모리다. 메인 메모리와 CPU사이에 위치하며, CPU속도에 버금갈만큼 메모리계층에서 가장 빠르며, 용량이 적고 비싸다 캐시메모리가 속도가 빠른이유 캐시메모리는 메인메모리에서 자주 사용하는 프로그램과 데이터를 저장해두어 속도를 빠르게한다. 이를 위해서 CPU가 어떤 데이터를 원하는지 어느정도 예측을 할수 있어야한다 캐시메모리에 CPU가 ‘다음에 참조할 정보'가 어느정도 들어있는지에 따라 캐시의 성능이 결정되기 떄문이다. 이를 위해서 사용하는것이, 캐시의 지역성(Locality)이다 Cache Locality(지역성) 데이터에 대한 접근이 시간적 혹은 공간적으로 가깝게 ..
파이썬이 C언어보다 느린 이유
·
CS지식
파이썬 동적 타이핑, 인터프리터 언어. 동적타입 vs 정적타입 동적타입이라는것은 선언할때 자료형을 선언하지 않다는것이고, 인터프리터가 정의된 객체의 자료형을 알고있지않다는것을 의미한다. 자료형의 명시 여부는 처리속도에도 영향을 미치는데 자료형을 명시했다면 런타임과정에서 자료형타입에 맞게 바로 함수를 호출하면 되지만, 자료형을 명시하지않았다면 런타임과정에서 객체의 존재를 확인 → 객체의 자료형타입을 확인 ( PyObject_HEAD) → 자료형타입에 맞게 함수 호출 하는 과정을 거친다. 자료형을 명시했다면 ‘객체의 자료형을 판단하지 않고' 바로 타입형에맞게 함수를 사용가능하다는것이다. 이는 선언하는 과정에서도 차이나는데 ## C언어 int a = 1; int b = a+2; ## Python a = 1 b..
프로그래머스 72411 메뉴리뉴얼 파이썬
·
CodingTest
링크 : https://programmers.co.kr/learn/courses/30/lessons/72411 문제 문자열의 부분문자열 부분문자열(substring)이란 쉽게말해서 문자열을 구성하고 있는 문자열이다. 예를들어 ‘abcd’의 경우, 길이가 1인 문자열 [ a, b, c, d ], 길이가 2인 문자열 [ ab, bc, cd ] 길이가 3인 문자열 [ abc, bcd ], 길이가 4인 문자열 [ abcd ] 조합을 사용한 문자열 문제를 잘 읽어보면 ‘부분문자열의 순서' 는 중요하지않다고 말한다. 만약 ab, ba가 있다면 이 두개는 사실 같은문자열으로 취급해줘야한다. 이때 사용하는 라이브러리가 from itertools import combinations 이다. 소스코드(해설) for cour..
jjongguet
뒤죽박죽 데이터엔지니어링