4

データの背景: いくつかの異なるゲームがプレイされており、それぞれが多数のプレイヤーをホストしています。各ゲームはいくつかのラウンドで構成され、各ラウンド中に関係する各プレイヤーがアクションを実行します。私がここでやろうとしているのは、プレイされているすべてのゲームでプレイヤーが行った個々のアクションの完全な履歴を格納するためのデータ構造をメモリ内に構築することです。

明らかな構造は、深くネストされたディクショナリ/ハッシュマップであり、それぞれgame_idが多数の にマップされplayer_id、各 player_id が異なる にマップされround_number、それぞれround_numberが にマップされますaction

つまり、game_id:player_id:round_number:action. 一方、私も使用できますgame_id:round_number:player_id:action

さまざまな分析目的で上記のデータ構造にアクセスしようとすると、問題が発生します。たとえばgame_id:player_id:round_number:action、特定のゲームの特定のラウンドでプレイヤーが行ったすべてのアクションを知りたい場合、 があると不便です。game_id:round_number:player_id:action逆に、特定のゲームの過程で特定のプレイヤーが行ったすべてのアクションを知りたい場合、があるのも同様に不便です。残念ながら、私の場合、これらの両方の質問を頻繁に行う必要があります。

そのようなデータを格納でき、前述のようにプレイヤー レベルとラウンド レベルの両方のデータにアクセスするのに便利な単一のデータ構造があるのではないかと思います。それが重要な場合、実装はPythonになります。

EDIT : このようなリレーショナル クエリを処理するために、インメモリ sqlite データベースを推奨する人が何人かいます。ただし、ここで説明するように、そのパフォーマンスは私にとって問題になる可能性があります: SQLite パフォーマンス ベンチマーク -- なぜ :memory: はとても遅いのですか? ディスクの 1.5 倍しか高速ではないのですか?

4

3 に答える 3

3

1つの方法は、データをdictに格納し、インデックスを維持して、データのさまざまなビューにすばやくアクセスできるようにすることです。これは、クラスまたは関数だけで構造化できます。これがjistその(テストされていない)です:

from collections import defaultdict

game_dict = {}  # keyed by (game, player, round) tuple
game_player_ix = defaultdict(list)
game_round_ix = defaultdict(list)

def add_action(game, player, round):
    game_dict[(game, round, player)] = action # track the action in the main dict
    game_player_ix[(game, player)].append(round)  # keep an index for lookups by player
    game_round_ix[(game, round)].append(player) # another index for lookups by round

def get_all_player_actions(game, player):
    return (game_dict[(game,player,round)] for round in game_round_ix[(game, player)]) # iterator

def get_all_round_actions(game, round):
    return (game_dict[(game,player,round)] for player in game_player_ix[(game, round)]) # iterator
于 2012-06-01T22:36:14.343 に答える
1

どちらかをお勧めします

  1. ネストされたマップに共通のアクセス パターンをラップする関数を持つクラスを作成します。
  2. sqlite3 データベースの使用。

編集:

質問を読み違えました、すみません。

これを行う単一のデータ構造は考えられませんが、データを少し複製するのは悪くありません。プレーヤーをクラスにすると、ラウンドにプレーヤーのアクションへのマップを格納し、プレーヤー クラスにそのプレーヤーが実行したアクションのリストを含めることができます。

于 2012-06-01T22:02:10.187 に答える
0

各タプルがプレーン (game_id、player_id、round_number、action) だけを格納する一連のタプルを格納できます。ID の代わりにインターンされたプレーヤー名の文字列を使用することもできます。どのような分析を行うべきかわからない場合、この形式は、統計分析のために各フィールドに等しくアクセスできるようにし、将来必要になった場合にデータベース内のストレージに簡単に変換できるようにします。

名前付きタプルも使用できます。

于 2012-06-03T11:37:55.550 に答える