0

株式追跡アプリケーションを構築しており、現在の価格 (Google Finance からプル) で株式モデルを毎分自動的に更新する必要があります。数千のレコードがあり、現在の方法は非常に遅く非効率的であるため、より効率的な方法でそれを行う方法を知る必要があります。

#models.py


class Stock(models.Model):
    ticker = models.CharField(max_length=200)
    current_price = models.DecimalField(max_digits=20, decimal_places=5)

以下のスクリプトは毎分 crontab を介して実行されます

#script set to run on a crontab
from takestock.stock_getter import get_quotes
from takestock.models import Stock


class Command(BaseCommand):
    help = 'Gathers current stock prices from Google Finance using stock_getter script (imported) and updates all stocks in the database to reflect the current stock price.'

def get_stock_dict(self):
    all_stocks = Stock.objects.all()
    stock_names = []

    for single_stock in all_stocks:
        stock_names.append(str(single_stock.ticker))

    stock_values = get_quotes(stock_names) #a list of values which corresponds to the list of names
    stock_dict = dict(zip(stock_names, stock_values)) #stock tickers and stock values zipped into dict (see below)

    return stock_dict
        #stock_dict looks like: {'GOOG': '73.84', 'AAPL': '520.34'}

def handle(self, *args, **options):

    stock_dict = self.get_stock_dict()
    for ticker, value in stock_dict.items():
        stock_obj = Stock.objects.get(ticker=ticker)
        stock_obj.current_price = value
        stock_obj.save()

この方法は機能しますが、非常に遅く、非常にデータベース集約的であると思います。これを達成できるより良い方法はありますか?ありがとう。

4

1 に答える 1

3

updateget/save ルーチンの代わりに使用します。

Stock.objects.filter(ticker=ticker).update(current_price=value)

特にティッカーが変更されない場合は、毎回すべてのティッカーをフェッチしないでください。それらを一度フェッチし、高速な k/v ストアにキャッシュします。ただし、それらを取得する必要がある場合は、価格ではなくティッカー シンボルのみonlyを取得するために使用します。

おそらく、最も遅い部分は Google からのフェッチです。そのコードを公開していないため、他のヒントを提供することは困難です。

于 2012-11-16T17:08:50.540 に答える