Python sqlite的速度是否足够快,可以取代预加载到内存中的内容?
假设我有一个包含50个玩家的游戏服务器,每个玩家都有一个角色列表(从5到500个角色,一个玩家一次只能玩一个角色) 是否最好将所有字符存储到数据库中,然后当播放器连接到服务器时,立即从数据库中加载所有字符并将其存储到列表中:Python sqlite的速度是否足够快,可以取代预加载到内存中的内容?,python,database,memory,sqlite,Python,Database,Memory,Sqlite,假设我有一个包含50个玩家的游戏服务器,每个玩家都有一个角色列表(从5到500个角色,一个玩家一次只能玩一个角色) 是否最好将所有字符存储到数据库中,然后当播放器连接到服务器时,立即从数据库中加载所有字符并将其存储到列表中: def on_connect(**event_args): player = Player() player.characters = load_characters(event_args['playerid']) # Load everything at
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)到底有多好?
如果您需要更多信息,请告诉我,不知道如何问这样的问题……对于50名玩家,我不会担心提高普通Sqlite3的使用速度,几乎所有内容都是基于内存的。Sqlite3缓存最后100条语句(如果需要,可以增加该值)以及2000页1k大小=2Mb的语句(在您的情况下应该足够了)。您可以使用以下方法增加此值:
conn.execute("""PRAGMA cache_size = 4000""") # 4 Mb
有关更多详细信息,请参阅。当预测的比例为50*500时,一切都很快。跟着你的第一本能去做,如果它看起来很慢,写几个基准测试看看哪些部分让你慢下来。也就是说,只要在给定的时间只有一个应用程序尝试访问sqlite数据库,sqlite数据库就会非常快。“sqlite是否足够快,可以替换预加载到内存中的内容?”因为您无法定义什么是“足够快”,所以应该避免过早优化,使用最方便的方法,并查看在实际使用中是否太慢。与@elyase相呼应的是,我的感觉是sqlite不会成为瓶颈(但我不同意更改缓存大小)。如果您将整个DB加载到core,您如何知道需要写回哪些位,还是只写回整个DB?这将是低效的。如果您只加载了一行(实行或虚拟行),您将确切地知道需要写入的内容。我明白您的观点,但现在请尝试从另一个角度来看,如果您的参数严格有效,那么我们将不得不减小
缓存大小。我认为这甚至可能是页面大小需要针对每个应用程序/环境进行调整。默认值是一个折衷方案,选择在所有平台上都能正常工作,但从我所看到的大多数情况来看,它从更大的平台中获益。