2016-11-24 7 views
6

मैं एक खेल को मजबूर कर रहा हूं और मुझे सभी पदों और परिणामों के लिए डेटा स्टोर करने की आवश्यकता है। डेटा आकार में सैकड़ों जीबी की संभावना होगी। मैंने एसक्यूएल माना, लेकिन मुझे डर है कि एक तंग पाश में लुकअप प्रदर्शन को मार सकता है। कार्यक्रम संभावित पदों पर फिर से शुरू होगा और यदि यह ज्ञात हो तो विजयी कदम वापस लौटाएगा, अगर सभी चालें खोने के लिए जानी जाती हैं और अज्ञात चाल के परिणाम देखने की आवश्यकता होती है तो सबसे लंबे समय तक हारने का अनुक्रम वापस लौटाएं।कुशल जावा मानचित्र को कुशलतापूर्वक कैसे स्टोर करें?

बड़े Map<Long,Long[]> positionIdToBestMoves को स्टोर करने का सबसे अच्छा तरीका क्या है? मैं एसक्यूएल या डेटा क्रमबद्धता पर विचार कर रहा हूं।

मैं जावा में सभी व्यवहार्य चालों को मजबूर करने के लिए छोटे चेकर्स को हल करना चाहता हूं। पदों की ऊपरी सीमा लगभग 100 अरब है। उनमें से अधिकतर व्यावहारिक नहीं हैं (यानी खेल की शुरुआत में मौजूद थे से अधिक टुकड़े)। कुछ 10 बिलियन एक उचित अनुमान है। प्रत्येक Map<Long, Long[]> position मानचित्र Long positionID से Long whiteToMove और Long 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; 
} 
+2

दिलचस्प सवाल। उत्तर देने के लिए मेरे कौशल से परे लेकिन आप जो भी वर्णन करते हैं वह पारंपरिक एसक्यूएल के बजाय बड़े डेटा/नोएसक्यूएल समाधान के क्षेत्र की तरह लगता है। – Gimby

उत्तर

3

आप Chronicle को देखने के लिए चाहते हो सकता है:

खोजें ही इस तरह की एक प्रत्यावर्तन के लिए होगा। यह अत्यधिक अनुकूलित कुंजी-मूल्य भंडारण है और इसे आपके उद्देश्य के लिए उपयुक्त होना चाहिए।

या आप स्वयं द्वारा स्टोरेज लिख सकते हैं, लेकिन आप अभी भी हुड के नीचे मानचित्र और मेमोरी मैप की गई फ़ाइल जैसे कुछ कर रहे हैं।

संबंधित मुद्दे