Алгоритм потоковой передачи JSON - без стека - PullRequest
2 голосов
/ 02 февраля 2011

Можно ли спроектировать потоковый алгоритм JSON, который записывает JSON непосредственно в сокет со следующими свойствами:

* can only write to, but cannot delete or seek within the stream
* does not use either an IMPLICIT or explicit stack
* uses only a constant amount of memory stack depth no matter how deep the object nesting within the json

{ "1": { "1": { "1": { "1": { "1": { "1": { "1": { "1": { "1": {» 1 ": {" 1 ": {" 1 ": {" 1 ": {" 1 ": {" 1 ": {" 1" : {...}}}}}}}}}}}}} }}}}

Ответы [ 2 ]

1 голос
/ 02 февраля 2011

Краткий ответ: Нет.

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

0 голосов
/ 16 февраля 2017

Нет, потому что вы могли бы использовать такую ​​программу для сжатия бесконечных объемов памяти в конечное пространство.

Реализация кодировки:

input = read('LIBRARY_OF_CONGRESS.tar.bz2')
input_binary = convert_to_binary(input)
json_opening = replace({'0':'[', '1':'{'}, input_binary)
your_program <INPUTPIPE >/dev/null
INPUTPIPE << json_opening

Запустите вышеуказанную программу и затем клонируйте виртуальную машину, на которой она запущена. Это ваша сжатая версия конечного пространства бесконечно большого набора входных данных. Затем декодировать ...

Реализация декодирования:

set_output_pipe(your_program, OUTPUTPIPE)
INPUTPIPE << EOL
json_closing << OUTPUTPIPE
output_binary = replace({']':'0', '}':'1'}, reverse(json_closing))
output = convert_from_binary(output_binary)
write(output, 'LIBRARY_OF_CONGRESS-copy.tar.bz2')

И, конечно, у всего хорошего кода должен быть тестовый пример ...

Контрольный пример:

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