Have roblox datastore key write and read limits changed?

local HttpService = game:GetService("HttpService")
local DataStoreService = game:GetService("DataStoreService")
local DataStore = DataStoreService:GetDataStore("DataStore")

local Random = Random.new()

for i = 1,20,1 do
	local Tbl = {}
	for i = 1,200_000 + math.random(1,10),1 do
		Tbl[i] = Random:NextInteger(1,20_000_000_000_000_000)
	end
	DataStore:UpdateAsync("Something", function()
		return Tbl
	end)
	local Result = DataStore:GetAsync("Something")
	table.sort(Result,function(v1,v2)
		return v1 < v2
	end)
	print(#HttpService:JSONEncode(Result))
end

I exceed this limit in every way. But it still works. Are these limits old or did I misunderstand?

2 Likes

Not sure why you don’t exceed the limits but yes they have changed: DataStores Access and Storage Updates
I don’t think you’re writing THAT much data. Only a few megabytes or so?

The documented limits for Roblox DataStores still officially exist…about 260,000 characters per key, 60 requests per minute per user, and too frequent writes risk throttling. But here’s the twist: those limits aren’t always enforced in a super hard way until you hit production scale or do it from multiple servers/users. In Studio or small tests, you can often exceed size or frequency without errors, just like in your example. So it seems to “work,” but it’s risky — you could get throttled or blocked unpredictably in live servers. If your data is pushing 200K+ characters, consider using compression or chunking strategies to stay safe.

1 Like

you can store up to 4MB in the datastore, the info you’ve provided might be outdated

that is not the full datastore, thats the maximum size limit of the key

I like your line of thinking, I haven’t once taken the time to see if these limitations are actually true. I know that a lot of the documentation related to Datastores is outdated, like Metadata having key/value limits of 50/250 when instead it just has an overall length limit of 300 (after JSONEncode and it must be a dictionary).

Approach and case results

Read per iteration on one key: ~ 7 MB (GetAsync AND UpdateAsync)
Write per iteration on one key: ~ 3.5 MB

Single Server:

Provided Case

Key Amount - 1
Iterations - 20
Total Read - 140 MB
Total Write - 70 MB
Duration - 40
Read Throughput - 210 MB / minute
Write Throughput - 105 MB / minute

60 Iterations Case

Key Amount - 1
Iterations - 60
Total Read - 420 MB
Total Write - 210 MB
Duration - 120
Read Throughput - 210 MB / minute
Write Throughput - 105 MB / minute

300 Iterations Case

Key Amount - 1
Iterations - 300
Total Read - 2.1 GB
Total Write - 1.05 GB
Duration - 600 s
Read Throughput - 210 MB / minute
Write Throughput - 105 MB / minute

2 Keys 300 Iterations Case

Key Amount - 2
Iterations - 300
Total Read - 4.2 GB
Total Write - 2.1 GB
Duration - 760 s
Read Throughput - 330 MB / minute
Write Throughput - 165 MB / minute

20 Keys 20 Iterations Case

Intention is to see how keys impact throughput
Key Amount - 20
Iterations - 20
Total Read - 2.8 GB
Total Write - 1.4 GB
Duration - 400 s
Read Throughput - 420 MB / minute
Write Throughput - 210 MB / minute

20 Keys 30 Iterations Case

Intention is to see whether the throughput changes
Key Amount - 20
Iterations - 30
Total Read - 4.2 GB
Total Write - 2.1 GB
Duration - 600 s
Read Throughput - 420 MB / minute
Write Throughput - 210 MB / minute

50 Keys 6 Iterations Case

Intention is to see how keys impact throughput
Key Amount - 50
Iterations - 6
Total Read - 2.1 GB
Total Write - 1.05 GB
Duration - 300 s
Read Throughput - 420 MB / minute
Write Throughput - 210 MB / minute

50 Keys 1 Iterations Case

We are looking for BEST cases throughputs
Key Amount - 50
Iterations - 1
Total Read - 350 MB
Total Write - 175 MB
Duration - 50 s
Read Throughput - 420 MB / minute
Write Throughput - 210 MB / minute

Two Servers:

20 Keys 20 Iterations Case

Key Amount - 20 (per server)
Iterations - 20 (per server)
Total Read - 5.6 GB
Total Write - 2.8 GB
Duration - 500 s
Read Throughput - 660 MB / minute
Write Throughput - 330 MB / minute

20 Keys 30 Iterations Case

Key Amount - 20 (per server)
Iterations - 30 (per server)
Total Read - 8.4 GB
Total Write - 4.2 GB
Duration - 720 s
Read Throughput - 700 MB / minute
Write Throughput - 350 MB / minute

50 Keys 6 Iterations Case

Key Amount - 50 (per server)
Iterations - 6 (per server)
Total Read - 4.2 GB
Total Write - 2.1 GB
Duration - 345 s
Read Throughput - 730 MB / minute
Write Throughput - 365 MB / minute

50 Keys 1 Iterations Case

We are looking for BEST cases throughputs
Key Amount - 50 (per server)
Iterations - 1 (per server)
Total Read - 700 MB
Total Write - 350 MB
Duration - 55 s
Read Throughput - 760 MB / minute
Write Throughput - 380 MB / minute

Code:

Used Code
--[[
	This script is cloned, enabled, and renamed N times, where N is the key amount.

	Intention is to perform as FAST as possible (with different data), not as safe.

	This code is modified from: 
	https://devforum.roblox.com/t/have-roblox-datastore-key-write-and-read-limits-changed/3608749
]]
local HttpService = game:GetService("HttpService")
local DataStoreService = game:GetService("DataStoreService")
local DataStore = DataStoreService:GetDataStore("DataStore")

local GetOptions = Instance.new("DataStoreGetOptions")
GetOptions.UseCache = false

local Random = Random.new()
local id = game.JobId..script.Name
local count = 20 -- Iterations, changed based on case

local throughput = 0
print(os.time())
for i = 1, count do
	local Tbl = {}
	for i = 1,200_000 + math.random(1,10),1 do
		Tbl[i] = Random:NextInteger(1,20_000_000_000_000_000)
	end
	DataStore:UpdateAsync(id, function()
		return Tbl
	end)
	local Result = DataStore:GetAsync(id, GetOptions)
	if Tbl[0] ~= Result[0] then
		error("Data did not save")
	end
	-- For verifying size
	--throughput += #HttpService:JSONEncode(Result)
end
print(os.time(), throughput)

Findings (Best-case) [As of 4/22/2025]

The results accurately find the write throughput for the key, since if we swap UpdateAsync with SetAsync we will get the same results. The results do NOT accurately find the read throughput, as we can remove UpdateAsync and use multiple scripts and we will get up to the servers bandwidth, one script is 350 MB / min. For server write throughput, I believe the maximum is 210 MB / minute, but it COULD rely on other servers.

Server

  • Read Throughput - Limited by server bandwidth
  • Write Throughput - 210 MB / minute

Per-Key

  • Read Throughput - Limited by server bandwidth
  • Write Throughput - 105 MB / minute

Maybe throughput has changed from per-key to global and they haven’t updated the documentation? Or there is a built-in cache that, should you send requests too fast, it will not actually write/read? I have not seen any indication, whether here or on create that the limits have changed, but even then we should be greatly exceeding the throughput limits.

This is unrelated, OP is talking about throughput limits, there is no indication in that thread that throughput limits have changed.

This is outdated by a few years, it has changed to 4MB per key and will become ~40 requests per minute per user in early 2026. Also Roblox uses Base64 encoding by default, so you may record that you are storing 4MB, but it could be much less, especially since this case uses purely numbers.

1 Like

There is no update for read or write.