1995년 5월 2일부터 상장된 모든 주식 종목들의 일별 가격 정보가 저장된 SQLITE 데이터베이스인데 크기가 만만치 않아서 Pandas로 불러오는데 시간이 꽤나 걸려서 몇 가지 방법을 찾아봤다.
그냥 Pandas.read_sql을 실행하는 것보다는 적절한 chunksize를 지정해서 불러오는 것이 더 나은 선택이었다. 그보다 더 좋은 방법이 뭐가 있을까 하다가 찾게 된 것이 connectorx라는 라이브러리다.
https://github.com/sfu-db/connector-x
GitHub - sfu-db/connector-x: Fastest library to load data from DB to DataFrames in Rust and Python
Fastest library to load data from DB to DataFrames in Rust and Python - GitHub - sfu-db/connector-x: Fastest library to load data from DB to DataFrames in Rust and Python
github.com
read_sql / read_sql(chunksize) / connectorX 속도 비교
그냥 read_sql을 실행했을 경우 42초, chunksize를 10,000 가량 지정한 경우 31초로 꽤 큰 폭으로 개선이 되지만, connectorx 라이브러리를 사용하면 11초대로 비교도 되지 않는 속도 차이다.
connectorx를 사용한 것에 비해서는 보잘것 없지만 chunksize도 여러가지 값들을 테스트해봤다. 데이터베이스의 구조와 크기에 따라 다르지면 위에 사용한 데이터베이스를 가지고 테스트를 해봤는데 10,000을 초과하면 크게 개선되지는 않았다.
사용한 전체 코드는 아래와 같다.
import sqlite3
from datetime import *
import connectorx as cx
import urllib
import pandas as pd
DATABASE_PATH = '\_DATABASE\KRX\database_krx_marcap.db'
def pd_read_sql():
start_time1 = datetime.now()
con = sqlite3.connect(DATABASE_PATH)
df = pd.read_sql("SELECT * FROM stock", con)
print(df.info())
print('pd.read_sql', datetime.now() - start_time1)
return df
def pd_read_sql_using_chunksize(chunksize=10000):
start_time1 = datetime.now()
con = sqlite3.connect(DATABASE_PATH)
tp = pd.read_sql("SELECT * FROM stock", con, chunksize=chunksize)
df = pd.concat(tp)
print(df.info())
print('pd.read_sql_chunksize', chunksize, datetime.now() - start_time1)
return df
def read_sql_using_connectorx2():
start_time = datetime.now()
con = 'sqlite://' + urllib.parse.quote(DATABASE_PATH)
df = cx.read_sql(con, "SELECT * FROM stock")
print(df.info())
print('connectorx2', datetime.now() - start_time)
return df
pd_read_sql()
pd_read_sql_using_chunksize()
read_sql_using_connectorx2()
'Python, API' 카테고리의 다른 글
[Python] DataFrame에 필터 적용 후 여러 개로 쪼개기 (0) | 2023.03.26 |
---|---|
[Python] KRX 주가데이터로 수정주가 계산 (0) | 2023.03.25 |
[Telegram API] pyTelegramBotAPI로 메시지 보내기 (0) | 2023.02.08 |
[Python-telegram-bot] bot.sendMessage - RuntimeWarning: coroutine 'Bot.send_mes (0) | 2023.02.04 |
Python 3.11의 속도개선 (feat. 5950X vs 7950X) (0) | 2023.01.07 |