Превышен максимальный размер сообщения IPC - PullRequest
0 голосов
/ 09 октября 2018

В настоящее время я разрабатываю инструмент, работающий в веб-браузере.

В этом проекте я использую IndexedDB с Dexie.js ver 2.x.

В Google Chrome,Я упомянул ошибку «Превышен максимальный размер сообщения IPC».Вероятно, это вызвано помещением таких огромных данных в IndexedDB.Моя специальная реализация заключалась в том, чтобы преобразовать массивы в строку на JSON.stringify, и однажды я смог решить эту проблему.Однако проблема возникла снова.

  • В моем приложении определена агрегация с именем Project.
  • Каждый Project имеет до 500 Input text.
  • Каждый Input text имеет 1 строку и его длина до 50 КБ.
  • Кроме того, каждый Project имеет Analysis, но содержит только параметры анализа.
  • Каждый Analysis имеет много Result.
  • Каждый Result содержит длину 20 КБ.
  • Input text и Result получены с помощью getAll() методов IndexedDB, отфильтрованных по projectId или analysisId.

Мой вопрос заключается в том, что ...

  1. Как избежать этой ошибки?
  2. Я хотел бы спасти данные, хранящиеся в IndexedDB.Я знаю, где хранятся данные в локальной файловой системе.Если это возможно, как это сделать?

1 Ответ

0 голосов
/ 11 октября 2018

Если вы посмотрите, что вызывает эту ошибку в реализации Chrome, например https://chromium.googlesource.com/chromium/src.git/+/master/content/browser/indexed_db/indexed_db_database.cc,, это происходит, когда размер сообщения слишком велик.Здесь размер сообщения в основном относится к объему данных, которые отправляются из C ++ (двоичного файла браузера) в Javascript в результате некоторой обработки.

Чтобы избежать отправки слишком большого количества данных, есть несколько вещей, которые вы могли быdo:

  • убедитесь, что вы никогда не вызываете getAll для большого количества данных
  • используйте ограничение при вызове getAll для потенциально большого объема данных
  • вместо этого используйте openCursorиз getAll
  • хранить меньшие объекты

Я думаю, что вам лучше всего попробовать перейти на openCursor.Это будет получать ваши предметы по одному (по запросу).Таким образом, вы никогда не столкнетесь с этой ошибкой.С помощью курсора вы теряете чуть-чуть скорости, но вы получаете масштабируемость.

Чтобы заставить курсор работать так же, как getAll, это просто.Все, что вам нужно сделать, это сначала объявить пустой массив, затем запустить курсор и выполнить итерацию, каждый раз добавляя элемент курсора в массив.В конце итерации вы, по сути, собрали из одного за раз кусочки того же массива, что и при вызове getAll.

...