#javascript #json #node.js
#javascript #json #node.js
Вопрос:
Надеюсь, кто-нибудь сможет обнаружить ошибку, потому что у меня проблемы
Хорошо, я создал свой собственный JSON.stringify только для пользовательских больших объектов. Возможно, это не совсем соответствует спецификации для некоторых граничных случаев, но предназначено только для упорядочивания больших объектов, которые я создаю сам.
Что ж, это работает, и хорошо работает для большинства объектов, но у меня есть объект, который я пытаюсь преобразовать в строку, и он терпит неудачу и печатает это перед выходом:
node.js:134
throw e; // process.nextTick error, or 'error' event on first tick
^
undefined
Не очень полезно. С объектом все в порядке, потому что обычный вызов JSON.stringify(object)
работает нормально, и когда я выполняю итерацию по объекту с помощью for (var x in obj) if (obj.hasOwnProperty(x)) { myStringify(obj); }
, это работает нормально, но если я вызываю его на верхнем уровне объекта, все летит к чертям… На самом деле это не имеет смысла для меня, и единственное, о чем я могу думать, это уровень, на котором рекурсия каким-то образом что-то нарушает…
Анализатор : https://gist.github.com/958776 — Функция stringify, которую я вызываю
ObjectIterator.js : https://gist.github.com/958777 — В основном для обеспечения асинхронной итерации
Редактировать Итак, я повторил объект на один уровень глубже и сравнил результирующую строку со строкой JSON.stringify(sameLevelDeep)
, и они равны. Поскольку выходные данные равны, я не уверен, что это то, как я что-то анализирую, но возможно, что это такой большой объект или количество рекурсии настолько велико?
Редактировать 2 Итак, я «исправил» проблему, я полагаю. Вместо того, чтобы каждую 25-ю итерацию переводить в следующий цикл событий, я запускаю каждую пятую. Я не уверен, почему это имело бы значение, но это имеет значение… Я думаю, теперь возникает вопрос «Почему это имеет значение»?
Комментарии:
1. Похоже, я оставил некоторый код в ObjectIterator и Parser для некоторой отладки, которую я делал… большая часть этого протоколирования и синхронизации
2. Я бы рекомендовал попробовать упорядочить его с помощью других реализаций, например JSON.stringify в Chromium, и посмотреть, отличается ли у вас поведение.
3. Верно, как я уже сказал, работает обычный
JSON.stringify(object)
.4. есть ли конкретная причина, по которой стандарт
JSON.stringify()
вам не подходит?5. @Andy E: Это блокирует, и некоторые из этих объектов содержат 5-10 миллионов символов после их преобразования в строку.
Ответ №1:
Хорошо, помимо того, что это очень конкретный вопрос, помогающий очень конкретному человеку, я хотел бы перенести это в другое место, что также могло бы устранить вашу проблему и, возможно, помочь другим.
Поскольку вы не указываете, почему вы проходите через этот процесс, мне придется разбить его и угадать — и предоставить решение для каждой угаданной идеи.
1. (Браузер) Вы пытаетесь использовать JavaScript для обработки данных и предоставления пользователю результата
Загрузка по крайней мере нескольких мегабайт необработанных данных («некоторые из этих объектов содержат 5-10 миллионов символов») на веб-страницу для обработки и отображения результата далека от оптимальной, вероятно, вам следует выполнить эту операцию на стороне сервера и загрузить предварительно рассчитанный результат.
Кроме того, независимо от того, что вы делаете, JavaScript не поддерживает потоки. setTimeout(1, function() { JSON.stringify(data); });
не должно сильно отличаться от того, что вы делаете.
2. (Браузер) Вы пытаетесь отобразить загруженный контент
Вам следует попытаться загрузить меньшие фрагменты вместо всего содержимого объемом более 10 миллионов символов, используя встроенный метод JSON.stringify.
3. (Не в браузере) Вы пытаетесь использовать JavaScript для приложения, требующего многопоточности
Вам следует рассмотреть возможность использования другого языка программирования для этого приложения.
В итоге
Я думаю, что вы взбираетесь не на ту гору, вы можете достичь того же, обойдя ее, не потея. Если вы хотите подняться на гору ради кайфа, есть горы, которым это нужно — но это не эта.
Перевод: Работайте над архитектурой, чтобы устранить препятствие, вместо того, чтобы пытаться его решить, если вы хотите решить проблему, есть проблемы, которые требуют решения — но это не эта.