2016-11-24 21 views
6

Ben bir oyunu zorluyorum ve tüm pozisyonlar ve sonuçlar için veri depolamam gerekiyor. Veriler büyük olasılıkla yüzlerce Gb olacaktır. SQL'i düşündüm, ancak sıkı bir döngüde aramaların performansı azaltabileceğinden korkuyorum. Program olası pozisyonlar üzerinde yineleyecek ve eğer biliniyorsa kazanan hamleleri iade edecek, eğer tüm hamlelerin kaybedildiği biliniyorsa ve bilinmeyen hamlelerin sonucunu kontrol ederse, en uzun kaybetme sırasına dönün.Büyük bir Java haritasını verimli bir şekilde nasıl depolarsınız?

Büyük bir Map<Long,Long[]> positionIdToBestMoves depolamanın en iyi yolu nedir? SQL veya veri serileştirmeyi düşünüyorum.

Java'daki tüm uygulanabilir hareketleri zorlayarak küçük denetleyicileri çözmek istiyorum. Pozisyonların üst sınırı 100 milyar civarındadır. Bunların çoğu makul değildir (yani oyunun başlangıcında mevcut olandan daha fazla parça). Yaklaşık 10 Milyar makul bir tahmindir. Her bir Map<Long, Long[]> position, Long whiteToMove ve Long blackToMove ile Long positionID haritaları. Pozitif değer, pozisyonun kazanıldığını ve değerde depolanan pozisyona götüren bir hareketin seçilmesi gerektiğini belirtir. Negatif değer -n, konumun en fazla n hamlesinde kaybediyor anlamına gelir.

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

İlgi çekici bir soru. Benim cevap verme yeteneğimin ötesinde ama anlattığınız şey, geleneksel SQL'den ziyade büyük bir veri/NoSQL çözümünün toprakları gibi daha çok ses çıkarır. – Gimby

cevap

3

Sen Chronicle bakmak isteyebilirsiniz:

Arama kendisi böyle bir özyinelemeye olurdu. Son derece optimize edilmiş anahtar-değer depolama alanıdır ve amacınıza uygun olmalıdır.

Veya depolamayı kendiniz yazabilirsiniz, ancak yine de başlığın altında harita ve bellek eşlemeli dosya gibi bir şey yapmaya devam edebilirsiniz.

İlgili konular