How to optimize a data warehouse that is updated every second?

Well basically I want to optimize the following script so that the following warn does not come out “The data store request was added to the queue. If the request queue fills up, more requests will be dropped.” This warning is sent to me when I finish playing in the studio, but I really don’t know how to prevent it from coming out.

local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local SaveDataStore = DataStoreService:GetDataStore("SaveData")


local function SavePlayerData(player)
	local success, errormsg = pcall(function()
		wait(1)
		local SaveData = {}
		for i, Folder in pairs(player.NivelAndExp:GetChildren()) do
			SaveData[Folder.Name] = Folder.Value
		end	
		SaveDataStore:SetAsync(player.UserId, SaveData)
	end)
	if not success then 
		return errormsg
	end			
end	


Players.PlayerAdded:Connect(function(player)
	local Folder = Instance.new("Folder")
	Folder.Name = "NivelAndExp"
	Folder.Parent = player
	local level = Instance.new("IntValue")
	level.Name = "Nivel"
	level.Value = 0
	level.Parent = Folder
	local experience = Instance.new("IntValue")
	experience.Name = "Total XP"
	experience.Value = 0
	experience.Parent = Folder

	local Data = SaveDataStore:GetAsync(player.UserId)
	if Data then
		for i, Folder in pairs(Folder:GetChildren()) do
			Folder.Value = Data[Folder.Name]
		end		
	else		
		print(player.Name .. " No tiene datos.")			
	end
	local expToLevelUp
	local expForPreviousLevel = 0

	while wait(1) do
		local PlayerGui = player:FindFirstChild("PlayerGui")
		if PlayerGui then
			local MenuDeMapa = PlayerGui:WaitForChild("MenuDeMapa")
			if level.Value < 1 then 
				expToLevelUp = 100 
			else
				expToLevelUp = math.floor(level.Value ^ 1.3) * 200 + math.floor(level.Value ^ 4)
			end
			if experience.Value >= expToLevelUp then
				level.Value = level.Value + 1	
			end
			expForPreviousLevel = math.floor((level.Value - 1) ^ 1.3) * 200 + math.floor((level.Value - 1) ^ 4)
			local expDifference = expToLevelUp - expForPreviousLevel
			local expDifference2 = experience.Value - expForPreviousLevel
			MenuDeMapa.Nivel.Bar:TweenSize(UDim2.new(MenuDeMapa.Nivel.BarBackground.Size.X.Scale * (expDifference2 / expDifference), 0, MenuDeMapa.Nivel.BarBackground.Size.Y.Scale, 0), Enum.EasingDirection.InOut, Enum.EasingStyle.Quint, 0.001)
			MenuDeMapa.Nivel.Experience.Text = expDifference2 .. "/" .. expDifference
			MenuDeMapa.Nivel.Level.Text = "Nivel: " .. level.Value
		end
	end			
end)


Players.PlayerRemoving:Connect(function(player)
	local errormsg = SavePlayerData(player)
	if errormsg then	
		warn(errormsg)		
	end	
end)

game:BindToClose(function()
	for i, player in pairs(Players:GetPlayers()) do	
		local errormsg = SavePlayerData(player)
		if errormsg then
			warn(errormsg)
		end			
	end
	wait(1)	
end)

Make it only do the Players.PlayerRemoving if RunService:IsStudio() is false.