2015-01-10 17 views
0

50 명의 플레이어가 포함 된 게임 서버가 있다고 가정 해보십시오. 각 플레이어는 5 ~ 500 자의 문자 목록을 가지고 있으며 플레이어는 한 번에 하나의 캐릭터 만 플레이 할 수 있습니다. 플레이어가 서버에 연결할 때sqlite는 메모리에 미리로드 된 내용을 대체 할 수있을만큼 빠르습니까?

가 데이터베이스에 모든 문자를 저장하기 위해 더 좋을 거라, 다음, 한 번에 데이터베이스에서 모든 문자를로드 목록에 저장할 :

def on_connect(**event_args): 
    player = Player() 
    player.characters = load_characters(event_args['playerid']) # Load everything at once 
    players[event_args['playerid']] = player  

def on_character_change(**event_args): 
    player = players[event_args['playerid']] 
    for char in player.characters: 
     if char.characterid == event_args['characterid']: 
      player.current_character = char 
      break 

그리고 플레이어가 서버와 연결을 끊으면 모든 캐릭터를 데이터베이스에 저장합니다.

데이터베이스에서 한 번에 한 문자 씩만로드 한 다음 플레이어가 문자를 변경하면 현재 문자를 데이터베이스에 저장하고 메모리에서 버리고 새 문자를로드합니다. 데이터 베이스?

그래서 기본적으로 RAM 대 데이터베이스로드 속도, 데이터베이스 (sqlite3) 실제로 얼마나 좋은가요? 더 자세한 정보가 필요하면이 질문을하는 방법을 모르겠다.

+0

예상 스케일이 50 * 500이면 모든 것이 빠릅니다. 첫 번째 본능이 무엇이든간에 무엇이든지 진행하십시오. 느린 경우 두 가지 벤치 마크를 작성하여 어떤 부분이 속도를 늦추고 있는지 확인하십시오. 즉, sqlite 데이터베이스는 주어진 시간에 하나의 응용 프로그램이 액세스하려고 시도하는 한 매우 빠릅니다. – krait

+0

"sqlite는 메모리에 미리로드 된 내용을 대체 할만큼 빠르습니까?" "충분히 빠르다"는 것을 정의 할 수 없기 때문에 조기 최적화를 피하고, 가장 편리한 것을 사용하고, 실제 사용에서 너무 느린 지 확인해야합니다. @elyase 내 느낌을 반영하는 것은 sqlite가 병목 현상이되지 않는다는 것입니다 (그러나 캐시 크기를 변경하는 것에 동의하지 않습니다). 전체 DB를 코어에로드 한 경우 다시 쓸 필요가있는 비트를 알 수 있습니까? 아니면 전체 DB를 다시 작성 하시겠습니까? 그것은 비효율적 일 것입니다. 단일 (실제 또는 가상) 행을로드 한 경우 정확히 필요한 내용을 알 수 있습니다. – msw

+0

당신이 가리키는 것을 보았으나 이제는 다른 방식으로 보려고합니다. 당신의 주장이 엄격히 유효하다면'cache_size'를 줄여야 할 것입니다. 나는 이것이 각각의 앱/환경을 위해 조정될 필요가있는'page_size '일지도 모른다라고 생각한다. 기본값은 모든 플랫폼에서 합리적으로 잘 작동하도록 선택한 절충안이지만 대부분의 경우에서 본 것보다 크다는 이점이 있습니다. – elyase

답변

2

50 명이 들어도 일반 Sqlite3을 사용하는 속도를 향상시키는 것에 대해서는 거의 신경 쓰지 않는다. 거의 모든 것이 메모리 기반이 될 것이다. . Sqlite3은 마지막 100 문장을 캐시하고 (필요한 경우이 값을 늘릴 수 있음) 1k 크기의 2000 페이지 = 2MB (귀하의 경우 충분해야 함)를 캐시합니다. 당신과 함께이 값을 늘릴 수 있습니다

conn.execute("""PRAGMA cache_size = 4000""") # 4 Mb 

은 자세한 내용은 Optimization FAQ를 참조하십시오.