Datastore2 Data Throttling

So I’ve made my biggest datastore yet with Datastore2, however, after I added many values to save without tables as I was told Datastore2 puts them all in a table for you with the Datastore2.Combine() built-in function, however, even after doing it, I still have data throttling.
Here is the problematic piece of the code:

DataStore2.Combine("DATA", "Velo", "Level", "EXP", "Race","Class","MaxEXP","StatPoints","ManaStat","PhysicalStat","DefenceStat","SpiritStat","Key1","Key1Skill","Key2","Key2Skill","Key3","Key3Skill","Key4","Key4Skill","Key5","Key5Skill","Key6","Key6Skill","Key7","Key7Skill","Key8","Key8Skill","Key9","Key9Skill","Key0","Key0Skill")

Players.PlayerAdded:Connect(function(player)
	local VeloStore = DataStore2("Velo", player)
	local LevelStore = DataStore2("Level", player)
	local EXPStore = DataStore2("EXP", player)
	local RaceStore = DataStore2("Race", player)
	local ClassStore = DataStore2("Class", player)
	local MaxEXP = DataStore2("MaxEXP", player)
	local StatPointsStore = DataStore2("StatPoints", player)
	local ManaStatStore = DataStore2("ManaStat", player)
	local PhysicalStatStore = DataStore2("PhysicalStat", player)
	local DefenceStatStore = DataStore2("DefenceStat", player)
	local SpiritStatStore = DataStore2("SpiritStat", player)
	-- // Key Datastore \\ --
	local Key1Store = DataStore2("Key1",player)
	local Key1SkillStore = DataStore2("Key1Skill",player)
	local Key2Store = DataStore2("Key2",player)
	local Key2SkillStore = DataStore2("Key2Skill",player)
	local Key3Store = DataStore2("Key3",player)
	local Key3SkillStore = DataStore2("Key3Skill",player)
	local Key4Store = DataStore2("Key4",player)
	local Key4SkillStore = DataStore2("Key4Skill",player)
	local Key5Store = DataStore2("Key5",player)
	local Key5SkillStore = DataStore2("Key5Skill",player)
	local Key6Store = DataStore2("Key6",player)
	local Key6SkillStore = DataStore2("Key6Skill",player)
	local Key7Store = DataStore2("Key7",player)
	local Key7SkillStore = DataStore2("Key7Skill",player)
	local Key8Store = DataStore2("Key8",player)
	local Key8SkillStore = DataStore2("Key8Skill",player)
	local Key9Store = DataStore2("Key9",player)
	local Key9SkillStore = DataStore2("Key9Skill",player)
	local Key0Store = DataStore2("Key0",player)
	local Key0SkillStore = DataStore2("Key0Skill",player)

local Key1 = Instance.new("StringValue", skillInventory)
	Key1.Value = Key1Store:Get("One")	
	Key1.Name = "Key1"
	local SkillKey1 = Instance.new("StringValue", Key1)
	SkillKey1.Value = Key1SkillStore:Get("N/A")	
	SkillKey1.Name = "SkillKey1"
	
	local Key2 = Instance.new("StringValue", skillInventory)
	Key2.Value = Key2Store:Get("Two")	
	Key2.Name = "Key2"
	local SkillKey2 = Instance.new("StringValue", Key2)
	SkillKey2.Value = Key2SkillStore:Get("N/A")	
	SkillKey2.Name = "SkillKey2"
	
	local Key3 = Instance.new("StringValue", skillInventory)
	Key3.Value = Key3Store:Get("Three")	
	Key3.Name = "Key3"
	local SkillKey3 = Instance.new("StringValue", Key3)
	SkillKey3.Value = Key3SkillStore:Get("N/A")	
	SkillKey3.Name = "SkillKey3"
	
	local Key4 = Instance.new("StringValue", skillInventory)
	Key4.Value = Key4Store:Get("Four")	
	Key4.Name = "Key4"
	local SkillKey4 = Instance.new("StringValue", Key4)
	SkillKey4.Value = Key4SkillStore:Get("N/A")	
	SkillKey4.Name = "SkillKey4"
	
	local Key5 = Instance.new("StringValue", skillInventory)
	Key5.Value = Key5Store:Get("Five")	
	Key5.Name = "Key5"
	local SkillKey5 = Instance.new("StringValue", Key5)
	SkillKey5.Value = Key5SkillStore:Get("N/A")	
	SkillKey5.Name = "SkillKey5"
	
	local Key6 = Instance.new("StringValue", skillInventory)
	Key6.Value = Key6Store:Get("Six")	
	Key6.Name = "Key6"
	local SkillKey6 = Instance.new("StringValue", Key6)
	SkillKey6.Value = Key6SkillStore:Get("N/A")	
	SkillKey6.Name = "SkillKey6"
	
	local Key7 = Instance.new("StringValue", skillInventory)
	Key7.Value = Key7Store:Get("Seven")	
	Key7.Name = "Key7"
	local SkillKey7 = Instance.new("StringValue", Key7)
	SkillKey7.Value = Key7SkillStore:Get("N/A")	
	SkillKey7.Name = "SkillKey7"
	
	local Key8 = Instance.new("StringValue", skillInventory)
	Key8.Value = Key8Store:Get("Eight")	
	Key8.Name = "Key8"
	local SkillKey8 = Instance.new("StringValue", Key8)
	SkillKey8.Value = Key8SkillStore:Get("N/A")	
	SkillKey8.Name = "SkillKey8"
	
	local Key9 = Instance.new("StringValue", skillInventory)
	Key9.Value = Key9Store:Get("Nine")	
	Key9.Name = "Key9"
	local SkillKey9 = Instance.new("StringValue", Key9)
	SkillKey9.Value = Key9SkillStore:Get("N/A")	
	SkillKey9.Name = "SkillKey9"
	
	local Key0 = Instance.new("StringValue", skillInventory)
	Key0.Value = Key0Store:Get("Zero")	
	Key0.Name = "Key0"
	local SkillKey0 = Instance.new("StringValue", Key0)
	SkillKey0.Value = Key0SkillStore:Get("N/A")	
	SkillKey0.Name = "SkillKey0"
	
	local SkillInfo = {SkillKey1.Value,SkillKey2.Value,SkillKey3.Value,SkillKey4.Value,SkillKey5.Value,SkillKey6.Value,SkillKey7.Value,SkillKey8.Value,SkillKey9.Value,SkillKey0.Value}
	local KeyInfo = {Key1.Value,Key2.Value,Key3.Value,Key4.Value,Key5.Value,Key6.Value,Key7.Value,Key8.Value,Key9.Value,Key0.Value}
	game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player,SkillInfo,KeyInfo)
	-- // OnUpdate Functions For Keys \\ --
	
	Key1Store:OnUpdate(function(newKey)
		Key1.Value = newKey
		game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player,SkillInfo)
	end)
	Key1SkillStore:OnUpdate(function(newSkill)
		SkillKey1.Value = newSkill
		game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player,SkillInfo)
	end)
	
	Key2Store:OnUpdate(function(newKey)
		Key2.Value = newKey
	end)
	Key2SkillStore:OnUpdate(function(newSkill)
		SkillKey2.Value = newSkill
		game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player,SkillInfo)
	end)
	
	Key3Store:OnUpdate(function(newKey)
		Key3.Value = newKey
	end)
	Key3SkillStore:OnUpdate(function(newSkill)
		SkillKey3.Value = newSkill
		game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player,SkillInfo)
	end)
	
	Key4Store:OnUpdate(function(newKey)
		Key4.Value = newKey
	end)
	Key4SkillStore:OnUpdate(function(newSkill)
		SkillKey4.Value = newSkill
		game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player,SkillInfo)	
	end)

	Key5Store:OnUpdate(function(newKey)
		Key5.Value = newKey
	end)
	Key5SkillStore:OnUpdate(function(newSkill)
		SkillKey5.Value = newSkill
		game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player,SkillInfo)
	end)

	Key6Store:OnUpdate(function(newKey)
		Key6.Value = newKey
	end)
	Key6SkillStore:OnUpdate(function(newSkill)
		SkillKey6.Value = newSkill
		game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player,SkillInfo)
	end)

	Key7Store:OnUpdate(function(newKey)
		Key7.Value = newKey
	end)
	Key7SkillStore:OnUpdate(function(newSkill)
		SkillKey7.Value = newSkill
		game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player,SkillInfo)
	end)

	Key8Store:OnUpdate(function(newKey)
		Key8.Value = newKey
	end)
	Key8SkillStore:OnUpdate(function(newSkill)
		SkillKey8.Value = newSkill
		game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player,SkillInfo)
	end)

	Key9Store:OnUpdate(function(newKey)
		Key9.Value = newKey
	end)
	Key9SkillStore:OnUpdate(function(newSkill)
		SkillKey9.Value = newSkill
		game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player,SkillInfo)
	end)

	Key0Store:OnUpdate(function(newKey)
		Key0.Value = newKey
	end)
	Key0SkillStore:OnUpdate(function(newSkill)
		SkillKey0.Value = newSkill
		game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player,SkillInfo)
	end)

I believe that’s the most problematic piece of the code as it’s many values without a table, the reason I’ve done it without a table is that I need to detect when each one changes.

Any help is appreciated,
Thank you for your time :slight_smile:

2 Likes

I don’t know what’s wrong with how you’re using DataStore2, especially because you didn’t post the entire script, as far as I can tell. But here’s how you can DRY up your code quite a lot:


local dataStoreKeys = {
	"Velo", "Level", "EXP",
	"Race", "Class", "MaxEXP", "StatPoints",
	"ManaStat", "PhysicalStat", "DefenceStat", "SpiritStat",
}

local numberWords = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"}
numberWords[0] = "Zero"

for keyNum = 0, 9 do
	table.insert(dataStoreKeys, string.format("Key%d", keyNum))
	table.insert(dataStoreKeys, string.format("Key%dSkill", keyNum))
end

DataStore2.Combine("DATA", unpack(dataStoreKeys))

Players.PlayerAdded:Connect(function(player)
	local dataStores = {}
	for _, dataStoreKey in pairs(dataStoreKeys) do
		dataStores[dataStoreKey] = DataStore2(dataStoreKey, player)
	end

	local keyValues = {}
	for keyNum = 0, 9 do
		local keyValue = Instance.new("StringValue")
		keyValue.Name = "Key" .. keyNum
		keyValue.Value = dataStores[keyValue.Name]:Get(numberWords[keyNum])

		local skillKey1Value = Instance.new("StringValue")
		skillKey1Value.Name = "SkillKey" .. keyNum
		skillKey1Value.Value = dataStores["Key" .. keyNum .. "Skill"]:Get("N/A")

		keyValue.Parent = skillInventory
		skillKeyValue.Parent = keyValue

		keyValues[keyNum] = keyValue
	end
	
	local skillInfo = {}
	for keyNum = 0, 9 do
		table.insert(skillInfo, keyValues[keyNum]:GetChildOfClass("StringValue").Value)
	end
	for keyNum = 0, 9 do
		table.insert(skillInfo, keyValues[keyNum].Value)
	end

	--game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player,skillInfo,KeyInfo) --KeyInfo appears nowhere else, no idea what it is

	-- // OnUpdate Functions For Keys \\ --
	for keyNum = 0, 9 do
		local keyStore = dataStores["Key" .. keyNum]
		local keySkillStore = dataStores["Key" .. keyNum .. "Skill"]
		local keyValue = keyValues[keyNum]
		local skillKeyValue = keyValue:FindChildOfClass("StringValue")

		keyStore:OnUpdate(function(newKey)
			keyValue.Value = newKey
			game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player, skillInfo)
		end)

		keySkillStore:OnUpdate(function(newSkill)
			skillKeyValue.Value = newSkill
			game.ReplicatedStorage.Remotes.SkillInformation:FireClient(player, skillInfo)
		end)
	end
end)

Can’t test it to see if it’s exactly the same, but you probably get the idea. Instead of typing everything out 100 times, use the power of tables and loops.