Как я могу перенести много данных из chrome.storage.local в файл JSON? - PullRequest
0 голосов
/ 26 ноября 2018

Я создаю расширение Chrome, которое хранит много данных в chrome.storage.local.Под «много» я ​​подразумеваю, что когда я запускаю что-то вроде этого:

chrome.storage.local.getBytesInUse(i => console.log(i))

... я печатаю 150873495, указывая, что я храню около 150 МБ.Я хотел бы иметь возможность хранить больше, чем это.Я знаю, что это большое количество данных для расширения Chrome, но оно будет работать на моем собственном компьютере.

Ранее я публиковал Как я могу получить много данных в chrome.storage.local? , и эта проблема была решена путем исправления ошибки в Chrome.Теперь у меня есть другая проблема.

Я хотел бы перенести все данные в chrome.storage.local в какой-то текстовый файл (например, JSON).Однако, когда я запускаю что-то столь простое, как это:

chrome.storage.local.get(
    null,
    result => {
      console.log("Records retrieved");
    }
);

... использование памяти моим расширением (находится в диспетчере задач Chrome) возрастает до 2,4 ГБ, что на порядок большечем 150 МБ, что данные занимают на диске в chrome.storage.local.Допустим, я хочу сохранить эти данные в файл, используя метод, описанный в Расширение Chrome: локальное хранилище, как экспортировать .Мне нужно позвонить JSON.stringify:

chrome.storage.local.get(
    null,
    result => {
      console.log("Records retrieved");
      const json = JSON.stringify(result);
      console.log("JSON string length: " + json.length);
    }
);

Он никогда не доходит до комментария "Длина строки JSON", потому что вызов JSON.stringify приводит к тому, что использование памяти выходит за пределы 4 ГБ памяти, и расширение падает,У меня есть пара вопросов:

  • Есть ли способ сохранить эти 150 МБ памяти без использования 4 ГБ памяти?
  • Есть ли простой способ сохранить эти данные вглыбы?Учитывая асинхронную природу JavaScript и chrome.storage, кажется, что создание безопасного способа сделать это было бы сложно.

Edit

По запросу @ wOxxOm , вот некоторый код, используемый для генерации поддельных данных:

function randomString() {
  return Math.floor(Math.random() * 0xFFFFFFFF).toString(16);
}
for (let i = 0; i < 70000; i++) {
  const item = {time: Date.now()};
  for (let j = 0; j < 100; j++ ) {
    item[randomString()] = randomString();
  }
  const recordName = "record-" + Date.now() + "-" + randomString();
  const items = {};
  items[recordName] = item;
  chrome.storage.local.set(items);
}

Кажется, это занимает около 160 МБ в chrome.storage.local, но около 2,7 ГБ в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...