버그와 삽질
QUOTA_BYTES_PER_ITEM quota exceeded 해결법
유호건
2023. 1. 27. 17:45
반응형
크롬 익스텐션 개발 중, 8196Byte가 넘는 문자열을 chrome storage에 넣는 도중 아래와 같은 오류를 만났다.
QUOTA_BYTES_PER_ITEM quota exceeded
chrome.storage.sync.set 메서드를 통해 데이터를 저장할 때, chrome.storage.sync.QUOTA_BYTES_PER_ITEM 값보다 큰 데이터는 저장할 수 없다.
따라서 해당 크기만큼 쪼개서 저장해야 한다.
문자열 하나를 4Byte라고 가정하고(UTF-16)
2048자 만큼씩 쪼개서 storage에 저장하는 코드를 작성했다.
더 효율적으로 하려면 Blob 등을 이용해 정확히 8196Byte 단위로 쪼개서 저장해야 하지만,
그 정도의 효율성이 필요하지 않고 대부분 문자가 이모지(4Byte) 였기 때문에 충분히 효율적이라고 생각했다.
const getLargeStorage = async (key) => {
const chunkCount = parseInt((await chrome.storage.sync.get(key + "0"))[key + "0"]);
let json = "";
for (let i = 1; i <= chunkCount; i++){
const k = key + String(i);
json += (await chrome.storage.sync.get(k))[k];
}
if (!json) return null;
return JSON.parse(json);
}
const setLargeStorage = async (key, value) => {
const json = JSON.stringify(value);
const chunkSize = chrome.storage.sync.QUOTA_BYTES_PER_ITEM / 4;
const chunkCount = Math.ceil(json.length / chunkSize);
await chrome.storage.sync.set({ [key + "0"]: chunkCount });
for (let i = 1; i <= chunkCount; i++){
const chunk = json.substr((i - 1) * chunkSize, chunkSize);
await chrome.storage.sync.set({ [key + String(i)]: chunk });
}
}
그러나 이 경우에도, 데이터가 너무너무 큰 경우
분당 쓰기 횟수를 초과했다는 오류가 발생할 수 있어 주의해야 한다.
분당 쓰기 횟수는 최대 120/분 이므로, 분당 120 * 2048Byte 이상의 데이터는 쓸 수 없다.
반응형