2016-11-24 13 views
6

Tôi đang brute-buộc một trò chơi và tôi cần phải lưu trữ dữ liệu cho tất cả các vị trí và kết quả. Dữ liệu có thể sẽ có hàng trăm Gb. Tôi coi SQL, nhưng tôi sợ rằng tra cứu trong một vòng lặp chặt chẽ có thể giết chết hiệu suất. Chương trình sẽ lặp lại qua các vị trí có thể và trả lại di chuyển chiến thắng nếu nó được biết, trả về chuỗi mất dài nhất nếu tất cả các động thái được biết là mất và kiểm tra kết quả cho các động thái không xác định.Làm thế nào để lưu trữ hiệu quả một bản đồ Java lớn?

Cách tốt nhất để lưu trữ số lớn Map<Long,Long[]> positionIdToBestMoves là gì? Tôi đang xem xét SQL hoặc dữ liệu serialization.

Tôi muốn giải quyết các kiểm tra nhỏ bằng cách brute-buộc tất cả các chuyển động khả thi trong Java. Giới hạn trên của các vị trí là khoảng 100 tỷ. Hầu hết trong số họ là không chính đáng (tức là nhiều mảnh hơn đã có mặt trong phần đầu của trò chơi). Khoảng 10 tỷ là một ước tính hợp lý. Mỗi Map<Long, Long[]> position bản đồ Long positionID đến Long whiteToMoveLong blackToMove. Giá trị dương cho biết vị trí đang thắng và di chuyển đến vị trí được lưu trữ trong giá trị sẽ được chọn. Giá trị âm -n có nghĩa là vị trí bị mất nhiều nhất là ở n di chuyển.

Tìm kiếm bản thân sẽ có một đệ quy như thế này:

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

Câu hỏi hấp dẫn. Nó vượt ra ngoài khả năng của tôi để trả lời nhưng những gì bạn mô tả âm thanh giống như lãnh thổ của một giải pháp dữ liệu/NoSQL lớn hơn là SQL truyền thống. – Gimby

Trả lời

3

Bạn có thể muốn nhìn vào Chronicle. Nó được tối ưu hóa cao giá trị khóa lưu trữ và nó phải phù hợp với mục đích của bạn.

Hoặc bạn có thể tự mình lưu trữ, nhưng bạn vẫn sẽ làm một cái gì đó giống như bản đồ và bộ nhớ ánh xạ tập tin dưới mui xe.

Các vấn đề liên quan