while(1) work();
반응형

크롬 익스텐션 개발 중, 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 이상의 데이터는 쓸 수 없다.

반응형
profile

while(1) work();

@유호건

❤️댓글은 언제나 힘이 됩니다❤️ 궁금한 점이나 잘못된 내용이 있다면 댓글로 남겨주세요.

검색 태그