[英]Struggling to save objects to Django database thorough Celery Beat on Digital Ocean
我正在努力通過Celery Beat將對象保存到我的Django應用程序中(顯示OHLC數據)。
該腳本可以在本地環境(保存3M對象)上正常運行,但不能在Digital Ocean等VPN上運行。 它保存了一定數量的對象(大約200K對象或2GB),但是隨后刪除了其他對象以添加每個新對象,這完全令人困惑。
我的堆棧
我不在本地使用Supervisor,因此我認為這是導致問題的原因,但無法確定。 任何反饋/幫助將不勝感激。
腳本
@periodic_task(
# run_every=(crontab(minute='*/1')),
run_every=(crontab(minute='*/60')),
name="load_data",
ignore_result=False
)
def load_data():
# Forex OHLC
TOKEN = MYTOKEN
con = fxcmpy.fxcmpy(access_token = TOKEN, log_level = 'error')
start = dt.datetime(2010, 1, 1)
stop = dt.datetime.today()
df = pd.DataFrame(list(DatasourceItem.objects.filter(datasource__sub_category__exact='Forex').values('symbol')))
for i in df['symbol']:
datasource_item_obj = DatasourceItem.objects.get(symbol=i)
Ohlc.objects.filter(datasource = datasource_item_obj).delete()
if datasource_item_obj.base_symbol:
base_symbol = datasource_item_obj.base_symbol
tar_symbol = datasource_item_obj.tar_symbol
mod_symbol = base_symbol + "/" + tar_symbol
sys_symbol = base_symbol + tar_symbol
else:
sys_symbol = datasource_item_obj.symbol
mod_symbol = datasource_item_obj.symbol
data = con.get_candles(mod_symbol, period='D1', start=start, stop=stop)
del data['askopen']
del data['askclose']
del data['askhigh']
del data['asklow']
del data['tickqty']
data.columns = ['Open', 'Close', 'High', 'Low']
data = data[['Open', 'High', 'Low', 'Close']]
data.insert(loc=0, column='Symbol', value=sys_symbol)
data.reset_index(level=0, inplace=True)
data.dropna()
# .values = return numpy array
data_list = data.values.tolist()
for row in data_list:
new_price = Ohlc(time = row[0], symbol = row[1], open_price = row[2], high_price = row[3], low_price = row[4], close_price = row[5], datasource = datasource_item_obj)
new_price.save()
# Stock OHLC
start = dt.datetime.now() - dt.timedelta(days=(365.25*5))
stop = dt.datetime.today()
df = pd.DataFrame(list(DatasourceItem.objects.filter(datasource__sub_category__exact='Stock').values('symbol')))
for i in df['symbol']:
datasource_obj = DatasourceItem.objects.get(symbol=i)
old_price = Ohlc.objects.filter(datasource = datasource_obj).delete()
symbol = datasource_obj.symbol
data = get_historical_data(symbol, start=start, stop=stop, output_format='pandas')
del data['volume']
data.columns = ['Open', 'High', 'Low', 'Close']
data.insert(loc=0, column='Symbol', value=symbol)
data.reset_index(level=0, inplace=True)
data.dropna()
data_list = data.values.tolist()
for row in data_list:
price = Ohlc(time = row[0], symbol = row[1], open_price = row[2], high_price = row[3], low_price = row[4], close_price = row[5], datasource = datasource_obj)
price.save()
嘿,這是由於數據庫上發生的事務數量引起的,所以請嘗試優化數據創建查詢,例如,您可以使用批量創建而不是創建每個對象單獨的對象。
price_list
for row in data_list:
price = Ohlc(time = row[0], symbol = row[1], open_price = row[2], high_price = row[3], low_price = row[4], close_price = row[5], datasource = datasource_obj)
price_list.append(price)
Ohlc.objects.bulk(price_list)
可能不會一口氣創建大量的抵銷數據,然后將數據分解成塊1000。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.