簡體   English   中英

如何有效地存儲大型Java地圖?

[英]How to efficiently store a large Java map?

我很蠻力一場比賽,我需要存儲所有位置和結果的數據。 數據可能會達到數百Gb。 我考慮過SQL,但我擔心在緊密循環中查找會破壞性能。 如果已知,程序將迭代可能的位置並返回獲勝的移動,如果已知所有移動都已丟失則返回最長的丟失序列並檢查未知移動的結果。

存儲大型Map<Long,Long[]> positionIdToBestMoves的最佳方法是什么? 我正在考慮SQL或數據序列化。

我想通過強制解決微小的檢查器 - 強制Java中的所有可行動作。 頭寸的上限約為100億。 其中大多數都不合理(即比游戲開始時存在的碎片多)。 大約100億是一個合理的估計。 每個Map<Long, Long[]> positionLong positionID映射到Long whiteToMoveLong blackToMove 正值表示位置獲勝,應選擇導致存儲在值中的位置的移動。 負值-n表示位置在最多n移動中丟失。

搜索本身會有這樣的遞歸:

//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;
}

你可能想看看紀事 它是高度優化的鍵值存儲,它應該適合您的目的。

或者你可以自己編寫存儲空間,但是你仍然會在地圖和內存映射文件之下做一些事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM