2016-11-24 11 views
6

私は1つのゲームを強要しています。私はすべてのポジションと結果に対してデータを格納する必要があります。データはおそらく数百GBのサイズになります。私はSQLを考えましたが、タイトなループで検索するとパフォーマンスが低下する恐れがあります。プログラムは可能な位置を反復し、既知の場合は勝利の動きを返し、すべての動きが失われていると分かっていれば最長の失われたシーケンスを返し、未知の動きについて結果をチェックする。大きなJavaマップを効率的に保存するにはどうすればよいですか?

大きなものを保存する最も良い方法は何ですかMap<Long,Long[]> positionIdToBestMoves?私はSQLまたはデータのシリアル化を検討しています。

私はJavaで実行可能なすべての動きをブルートフォースで行いたいと思っています。ポジションの上限は約100億です。それらのほとんどは妥当ではない(すなわち、ゲームの始めに存在していたよりも多くの部分)。約10億は合理的な見積もりです。各Map<Long, Long[]> positionは、Long positionIDLong whiteToMoveLong blackToMoveにマッピングします。正の値は、ポジションが勝っていることを示し、値に格納されたポジションにつながる移動を選択する必要があります。負の値-nは、位置が最大でもn移動していることを意味します。あなたはChronicleを見てみたいことがあり

//this is a stub 

private Map<Long, Long[]> boardBook =... 

//assuming that all winning positions are known 
public Long nextMove(Long currentPos, int whiteOrBlack){ 
Set<Long> validMoves = calculateValidMoves(currentPos, whiteOrBlack); 
boolean hasWinner = checkIfValidMoveIsKnownToWin(validMoves, whiteOrBlack); 

if(hasWinner){ //there is a winning move - play it 
    Long winningMove = getWinningMove(validMoves, whiteOrBlack); 
    boardBook.get(currentPos)[whiteOrBlack] = winningMove ;  
    return winningMove ; 
    } 
boolean areAllPositionsKnown = checkIfAllPositionsKnown(validMoves, whiteOrBlack); 
if(areAllPositionsKnown){ //all moves are losing.. choose longest struggle 
    Long longestSequenceToDefeat = findPositionToLongestSequenceToDefeat(validMoves, whiteOrBlack); 
    int numberOfStepsTodefeat = boardBook.get(longestSequenceToDefeat)[whiteOrBlack]; 
    boardBook.get(currentPos)[whiteOrBlack] = longestSequenceToDefeat ; 
    return longestSequenceToDefeat; 
    } 

Set<Long> movesToCheck = getUntestedMoves(validMoves, whiteOrBlack); 
Long longeststruggle; 
int maxNumberOfMovesToDefeat =-1; 
for(Long moveTocheck : movesToCheck){ 
    Long result = nextMove(moveToCheck, whiteOrBlack); 
    if(result>0){ //just discovered a winning move 
      boardBook.get(currentPos)[whiteOrBlack] = winningMove ;  
      return winningMove ; 
     }else { 
      int numOfMovesToDefeat = -1*boardBook.get(moveTocheck)[whiteOrBlack]; 
      if(numOfMovesToDefeat >maxNumberOfMovesToDefeat){ 
       maxNumberOfMovesToDefeat =numOfMovesToDefeat ; 
       longeststruggle = moveTocheck; 
        } 
     } 
     } 
boardBook.get(currentPos)[whiteOrBlack] = -1*maxNumberOfMovesToDefeat; 
return longeststruggle; 
} 
+2

興味深い質問です。その答えは私のスキルを超えていますが、あなたが言うことは、伝統的なSQLではなく大きなデータ/ NoSQLソリューションの領域のように聞こえます。 – Gimby

答えて

3

検索自体は、このような再帰を持っているでしょう。高度に最適化されたKey-Valueストレージであり、目的に合ったものでなければなりません。

あなた自身でストレージを書き込むことはできますが、フードの下にマップやメモリマップファイルなどの処理を行うことになります。

関連する問題