반응형
크롬 익스텐션 개발 중, 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 이상의 데이터는 쓸 수 없다.
반응형
'버그와 삽질' 카테고리의 다른 글
맥미니 트리플모니터 구성 (0) | 2023.06.30 |
---|---|
Postman proxy HTTPS 요청 가로채기 (0) | 2023.03.15 |
CSS로 외곽 테두리 효과 (0) | 2023.01.23 |
WSL2와 Docker, 그리고 CUDA 연동 (0) | 2022.12.27 |
Autodesk Genuine Service 삭제하는 방법 (1) | 2022.12.27 |