웹소켓을 통해 쏟아져 들어오는 데이터(List타입)를 중복없이 순차적으로 저장하려면?

조회수 1182회

다루고 있는 데이터는 주가의 가격 데이터 같은 것인데요, 상황은 이렇습니다.

  1. Websocket에 연결
  2. Websocket은 최근 체결 거래 내역을 전송
  3. 1초에도 수십개씩 쏟아지는 체결내역은 data['trade']라는 리스트에 저장함
  4. data['trade']는 최대 200개까지 리스트를 저장하며, 200개 이후에는 최근 100개를 삭제함

이런식으로 쏟아지는 데이터를 중복없이 순차적으로 차곡차곡 쌓으려면 어떤 방식으로 구현하는게 좋을까요?

리스트 최대길이

'''MAX_TABLE_LENTH = 200'''

최근 거래내역 불러오는 함수

def recent_trades():
    return data['trade']

우선 이런식으로 사전에 구성된 함수가 있고

저는 처음에

while(true):
    re_td = recent_trades()
    csvWriter.writerow(re_td.values())

와 같은 식으로 변수 하나에 리스트를 쭉 저장하고, csv파일에 기록하는 식으로 코딩했더니

1~12, 1~34, 1~ 60...(생략).. 1~169, 1~200 까지

거래내역이 200개가 쌓일대까지 처음부터 모든 거래내역을 계속 쭈욱쭈욱 저장하더라고요

이후 200개가 쌓여서 최근 100개를 지우면 또

101~131, ... 101~186, 101~200 같이 계속 중복된 데이터를 처음부터 끝까지 저장합니다.

새로운 체결내역이 없으면 똑같은 체결내역을 무한대로 계속 저장하고요..

3분도 안되서 200MB가 넘는 중복데이터 덩어리의 csv파일을 얻게 됐습니다...

어떤 구조로 코드를 작성해야, 1부터 다시 탐색하는 일 없이, 이미 저장한 체결내역은 제외하고 새롭게 추가되는 체결내역만 저장할 수 있을까요?

제가 사용해야 하는 자료구조나, 프로그램 구조에 대해서 조언을 구합니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 중복 체크 로직이 있나요? data['trade']에 담기는 각 체결 내역에 increment로 증가하는 고유값이나 타임스탬프 같은 식별자가 있는지 확인해 보세요. 만약 그게 있다면 그걸 이용하셔야 합니다.

    예컨대 내려받는 데이터가 이렇게 생겼다면:

    [
      {
        id: 399865, // 이 값이 고유하며 항상 커진다고 가정
        stockId: 'APPL',
        dealType: 1,
        stockUnit: 80,
        stockUnitVal: 500,
        updatedAt: '2018-07-30 11:50'
      },
      ...
    ]
    

    중복 체크를 하는 유사 코드는 이렇게 될 겁니다.

    lastId = 0 // 마지막으로 처리한 자료의 id값
    for deal in data['trade']:
      if (deal.id > lastId): // 지금까지보다 더 큰 값이 나오면
        doSomething() // 작업을 수행하고
        lastId = deal.id // 지금 값을 마지막 처리한 값으로 저장
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)