python 과 socket

Vorhandenheit ·2022년 11월 11일
0

Python

목록 보기
1/2
post-custom-banner

Python 에서 데이터베이스로

이번의 업무로 csv파일을 읽어서 데이터베이스로 저장하는걸 맡게되었습니다.
여기서 데이터베이스는 Redis와 OpenTSDB를 사용하는데, Redis의 경우는 PUB/SUB으로만 사용해 그저 지나가는 수준에 불과했습니다.
반면에 시계열데이터베이스인 OPEN TSDB에 저장할려고하면 기존에는 HTTP POST를 사용하여 데이터를 집어넣었습니다.

csv 파일에서 데이터를 불러넣은건, 아무생각없이 들었던 수업에서 배웠던 pandas를 이용해 배열의 형태로 가져올 수 있었습니다.
(pandas말고 dask를 통해 csv파일을 더 빨리 불러올수 있습니다)

여기서 문제는 서울의 경우 5000행 30개 열, 제주 15000의 행 11개 열, 한 칸마다 metric을 다르게 해야되서 * 2 총 63000번의 http 요청을 보내야했습니다.

이렇게 했을 경우, 서울은 약 70초 정도 제주는 60초 정도의 시간이 걸렸습니다.

10분마다 CPU사용량이 올라가는걸 눈으로 확인할 수 있었습니다.

Question

  • Open TSDB가 HTTP request로 받을 경우, 최대 65000 byte 까지 가능하여, csv불러온 배열을 나눠야 했습니다.

  • 같은 API로 보내는데, HTTP를 보내니 일일히 하나씩 데이터를 보내는 형태였습니다.(어차피 CLUSTER IP를 써서 안쪽에서만 돌지만..)

Answer

Redis처럼 연결하고 단방향으로 데이터를 쭉쭉쭉 보내고 싶은데, OPEN TSDB가 해당 기능을 받지못하니 다른 방법을 찾아봤습니다.(혹시 이걸 알고 있는 분 알려주세요!)

그래서 든 생각은 일일히 HTTP 요청을 보내서 길을 찾게 하는게 아니라, 길을 터놓고 이 길로 데이터를 보내는 것이었습니다. 그래서 찾아보는 중에 해답을 내린게 바로 'Socket'이었습니다.

Socket

보통 양방향 통신 그리고 채팅 서비스에서 많이 사용하는데, socket을 통해 연결하고 데이터가 보낸 다는점에서 http request보다 더 적합해 보였습니다.

https://gist.github.com/tsuna/4113855

그러다가 저처럼 socket으로 데이터를 보낸 글을 찾을 수 있었습니다.
OpenTSDB는 '\n'을 입력해야 다음 데이터로 받아들입니다.

send("put {metric} {timestamp} {svalue} sensor={sensor['sensor_name']}\n")

위의 형태로 데이터를 보낼 수 있었습니다.

socket 연결하고나서 close()로 끊어야됩니다!

뭉쳐서 보내기

이제는 길을 텃고 데이터를 나눠서 보내게 되었습니다. 하지만 위에 글에서 보면 join을 통해 문자열을 합쳐 데이터를 한번에 보내는걸 보고, 데이터 덩어리를 보내고 싶었습니다.

buf = ''
but = but + "put {metric} {timestamp} {svalue} sensor={sensor['sensor_name']}\n"

요렇게 해서 반복문 돌리면 MemoryError가 납니다. 위에 방식대로 변수에 문자열을 더하는 방식으로 해야됩니다.
하지만 더 search하다 join보다 더 낳은 해결책을 찾게 되었습ㄴ다.

https://towardsdatascience.com/do-not-use-to-join-strings-in-python-f89908307273

문자열에 문자열을 더하자, 작동방식이 이게 더좋다!
이방식을 통해서 변수에 30000개의 데이터를 한번에 보낼 수 있게 됐습니다!

=>

뭉쳐서 보내는게 더 cpu소모량이 더 높습니다. 개별로 보내는게 더 안정적입니다!(sendall => send)

결과

cpu 사용은 20% 까지 낮출 수 있었고 시간의 경우 서울 약 50초, 제주 50초 정도로 10초 정도 낮출 수 있었습니다.
그리고 코드의 양 또한 줄일 수 있었습니다.

참조

https://soooprmx.com/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%86%8C%EC%BC%93-%EC%97%B0%EA%B2%B0-%EC%82%AC%EC%9A%A9%EB%B2%95/

profile
읽고 기록하고 고민하고 사용하고 개발하자!
post-custom-banner

0개의 댓글