코드로 우주평화

메모리와 csv파일 데이터 합치기 본문

Log/Today

메모리와 csv파일 데이터 합치기

daco2020 2022. 1. 18. 18:25
반응형

목표 

벌크 요청 시 요청한 수만큼 메모리와 파일 데이터를 합쳐 반환하기

 

 

문제

기존에는 벌크 요청을 할 경우 100개를 기준으로 반환하였는데, 사용자의 편의성을 높이기 위해 수량을 직접 선택하여 요청하면 어떨까 하는 생각이 들었다.

 

 

행동

들어온 수량에 따라 기존 메모리에 저장된 데이터를 가져오고 만약 모자르면 csv파일에서 나머지 데이터들을 가져오는 로직을 구현하였다.

 

 

1. 먼저, 실시간 데이터가 들어오는대로 메모리에 저장한다.

args = []
memory_args = []

# 실시간 데이터(arg)를 메모리에 저장하고 다시 전역변수로 변경한다
def recent_data(arg):
    args.append(arg)
    if len(args) > 100:
        insert_file(args.pop(0))
    
    # 전역변수로 변경! 그래야 다른 함수에서도 사용가능하기 때문!
    global memory_args
    memory_args = args

 

 

 

2. 만약 벌크가 '0'으로 들어온 경우 최근 데이터 1개만 반환한다.

# 메모리와 csv파일에서 최근 데이터를 1개 반환함

def select_one(code):
    rows = [row for row in memory_args if row[0] == code] # memory_args는 이전에 선언한 전역변수

    # 만약 메모리에 없다면 파일에서 데이터를 가져온다
    if not rows:
        return select_file_one(code)

    result_row = max(rows, key=lambda x: x[4])
    result = {
        "code": result_row[0],
        "volume": result_row[1],
        "bid": result_row[2],
        "ask": result_row[3],
        "timestamp": result_row[4]
    }

    return result

 

 

 

3. 벌크가 '0' 이상이라면 해당 숫자만큼 데이터를 반환한다.

이때 메모리에 데이터 수가 부족하면 csv파일에서 나머지를 가져와 리스트를 합쳐 반환한다.

# 메모리와 csv파일에서 최근 데이터를 요청한 수 만큼 반환함

def select_bulk(code, bulk_cnt):
    file_rows = []

    # 종목이 일치하는 메모리 데이터를 요청한 수만큼 가져온다
    memory_rows = [row for row in memory_args if row[0] == code][-bulk_cnt:]

    # 필요한 나머지 데이터 수 를 확인한다
    required_count = bulk_cnt - len(memory_rows)

    # 파일 데이터 호출 함수에 종목 코드와 필요한 데이터 수를 인수로 넣는다
    if required_count > 0:
        file_rows = select_file_bulk(code, required_count)

    # 메모리 리스트와 파일 리스트를 합쳐 최종 반환할 리스트를 만든다
    result_rows = file_rows + memory_rows

    result = [{
        "cnt": i+1, # 갯수 확인용
        "code": result_row[0],
        "volume": result_row[1],
        "bid": result_row[2],
        "ask": result_row[3],
        "timestamp": result_row[4]
    } for i, result_row in enumerate(reversed(result_rows))]

    return result

 

 

 

고민

처음에는 메모리가 함수 내에 지역변수로 할당되어 있었기 때문에 이를 다른 곳에서 어떻게 사용할 수 있을까 고민이 되었다. 그래서 기존에 들어는 보았지만 아직 써본 적이 없었던 global 전역변수를 사용해보기로 하고 구글링으로 사용법을 찾아 결국 문제를 해결할 수 있었다!

 

 

 

앞으로

메모리와 파일을 어디에 또 사용할 수 있을까 생각해본다면 메모리는 휘발성이므로 사라져도 되는 데이터, 파일은 휘발성을 아니지만 DB에 부담을 주지 않을 목적으로 사용하면 좋을 것 같다. 

 

주식을 예로 든다면, 주식의 실시간 데이터는 너무 양이 많으므로(매일 수백만 개..) '메모리'나 '파일'에 임시 저장해두었다가 그중에 유의미한 데이터만 'DB'로 옮기면 좋을 것 같다. 

 

 

 

 


 

 

 

레퍼런스

[Python] 전역 변수 지역 변수 사용법 총 정리/ global, nonlocal (tistory.com)

 

 

 

 

반응형