1

やりたいこと: 過去 1 日、過去 30 日間、過去 60 日間、過去 90 日間、各暦月、およびすべての期間について、最も人気のある検索クエリを計算します。

私の生データはタイムスタンプ付きの検索クエリのリストであり、関連するデータ集計のために夜間の cron ジョブを既に実行しているので、この計算をそれに統合したいと考えています。すべてのクエリを読むことは、毎日の集計では問題ありませんが (必要と判断できる限り)、他の期間ではコストのかかる計算になるため、事前にカウントされたデータを使用して節約する方法を探しています。時間。

やりたくないこと: 期間中の毎日のレコードを取得し、すべての集計を合計し、結果のリスト全体を並べ替え、上位 X の値を取得します。これは、特に「常時」リストの場合、非効率的です。

ヒープとバイナリ ツリーを使用して、リアルタイムの並べ替えを維持したり、データへのアクセスを高速化したり、各リストから単語を並行して読み取り、さまざまな制約や終了条件を使用してそれらの値をヒープにプッシュしたりすることを検討しましたが、これは常にルックアップ時間またはしばらくすると、基本的にすべてを見ることに戻ります。

また、各期間の累計を維持し、最新の日を追加して最も早い日を減算することも考えました (毎月の合計は毎月 1 日に保存されます) が、すべての期間の完全なカウントを毎日 (単に上位の X) と私はまだ毎日の合計のすべてのレコードを調べています。

これをより速く実行する方法はありますか?おそらく、他のデータ構造または私が気付いていない楽しい数学的プロパティを使用していますか? また、誰かが知る必要がある場合、このすべてが Django プロジェクト内に存在します。

4

3 に答える 3

1

短い答えはノーです。

昨年のトップ 10 の曲が、デイリー トップ 10 リストにあったという保証はありません (可能性は高いですが、保証はされていません)。

絶対に確実なトップ 10 を獲得する唯一の方法は、指定された期間のすべての投票を合計し、トップ 10 を選択することです。

于 2012-07-03T19:23:42.540 に答える
0

高性能コンテナ データ型の一部である Counter() クラスを使用できます。すべての検索のディクショナリを、その頻度のカウントを含むディクショナリへのキーとして作成します。


cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
    cnt[word] += 1
print cnt
Counter({'blue': 3, 'red': 2, 'green': 1})

于 2012-07-03T18:34:13.687 に答える
0

あなたがやっていることと一致するかどうかはわかりませんが、データが Django モデルを介して保存されている場合は、集計を利用して単一のクエリで情報を取得できます。

与えられた:

class SearchQuery(models.Model):
    query = models.CharField()
    date = models.DateTimeField()

それで:

import datetime
from django.db.models import Count

today = datetime.date.today()
yesterday = today - datetime.timedelta(days=1)
days_ago_30 = today - datetime.timedelta(days=30)
...

top_yesterday = SearchQuery.objects.filter(date__range=(yesterday, today)).annotate(query_count=Count('query')).order_by('-query_count')

top_30_days = SearchQuery.objects.filter(date__range=(days_ago_30, today)).annotate(query_count=Count('query')).order_by('-query_count')

...

これは、Django で実行する最も効率的な方法ですが、必ずしも最も効率的であるとは限りません。ただし、インデックスを追加するなどのことを行うqueryと、非常に役立ちます。

編集

それでリストにだまされてしまうと思いました。技術的には事後的にリストの重複を排除できますが、データベースとして Django 1.4+ と PostgreSQL を実行している場合は、これらのクエリセット.distinct('query')の末尾に簡単に追加できます。

于 2012-07-03T19:47:10.813 に答える