Подтвердить что ты не робот

Как направить разные данные (возможно, JSON) на сервер?

Я собираюсь периодически нажимать набор текстовых данных с веб-страницы на сервер, возможно, как JSON.

Для каждого нажатия ни один, некоторые или все данные могут быть изменены. Чтобы уменьшить объем данных, которые я должен отправить по кабелю, я бы хотел только отправить diff изменений в каждом нажатии.

Знаете ли вы какие-либо готовые решения/инструменты/библиотеки, которые:

  • Динамически создавать разницу JSON по мере внесения изменений (во избежание хранения oldJson и newJson и полного разбора каждого нажатия), написанного на JavaScript (т.е. для клиентской стороны)
  • Исправить существующий фрагмент JSON с помощью JSON diff на стороне сервера, написанный на любой платформе, которая не является Java или .NET ^ (необходимо запустить на Linux, Java не является вариантом для env, я вхожу, и Mono).

Кроме того, это даже лучший способ решить эту конкретную проблему? Есть ли лучший способ нажимать куски текстовых данных вокруг?

Изменить: Некоторые пояснения:

  • Вероятная структура данных будет в основном довольно плоской (в том смысле, что она высокосвязана, так что любые ссылки будут ссылаться на идентификационные данные, а не на фактические вложенные данные). Узлы содержат коллекцию деревьев, листья этих деревьев содержат фактические "примитивные" данные, такие как числа, строки и идентификаторы. Большинство изменений данных будут в листьях.
    • Большинство листовых данных будут очень маленькими (примитивы или меньше абзаца текста), но некоторые из них будут очень длинными (страницы "богатого" текста).
  • На данный момент мы можем рассматривать это строго взаимно однозначно, т.е. только один клиент подключен (в режиме чтения/записи) к какой-либо конкретной структуре данных.
  • Было бы неплохо сохранить сервер как можно более минимальным с точки зрения сложности - идея состоит в том, чтобы как можно больше отказаться от сервера. Хотя HTML5 по-прежнему в основном не поддерживается, мне все еще нужно хранить данные, хотя...

^ То, что вы ожидаете от случайного общего хостинга. Я говорю с вашими хорошими друзьями: PHP, Python, PERL, Ruby, теми, что есть. Или, что-то, что может быть легко установлено на случайном общедоступном хостинге.

4b9b3361

Ответ 1

Это то, с чем я боролся. Мне будет очень интересно, если кто-то другой предложит лучший ответ, чем мой, но пока...

сначала http://www.xn--schler-dya.net/blog/2008/01/15/diffing_json_objects/

Мне лично не удалось заставить эту библиотеку работать, но ваше перемещение может измениться.

Другой альтернативой является не попытка решить проблему с использованием алгоритма DIFF. Это довольно неэффективно, и в зависимости от проблемы вы можете получить более высокие показатели производительности, просто отправляя весь блок данных, даже если вы в конечном итоге повторяетесь. Это в основном относится к очень маленьким фрагментам данных. Очевидно, что будет поворотным моментом, поскольку данные, которые вам нужно передать, становятся больше, но это не будет очевидно, где точка поворота, без какого-либо измерения. Трюк здесь заключается в том, что чем больше ваши данные получаются, тем дольше ваш анализ вычислений тоже будет принят. Точка поворота определяется только пересечением двух линий, сформированных каждым методом, темпами роста, оба из которых будут линейными или худшими, в зависимости от того, как выполняется ваш diff. В худшем случае вы можете увидеть остров посередине, где diff получает лучшую производительность, но затем снова перебирается для еще больших наборов данных, и просто отправлять его по сети лучше.

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

Наконец, если вы собираетесь делать diff, самым эффективным способом я могу подумать, если вы можете разбить свой набор данных на дискретные "куски", каждый с уникальным идентификатором. Затем, когда вы запускаете diff, курсовая разница зависит от уровня "куска". то есть единственные сравнения, которые вы сделали бы, это ID ID. Если вы измените кусок, дайте ему новый идентификатор. Курсор, который вы можете позволить себе сделать алгоритмом diff, тем меньше времени потребуется для запуска.

В качестве альтернативы вместо того, чтобы назначать новый идентификатор при изменении, вы можете просто запустить diff, чтобы проверить, изменился ли какой-либо конкретный объект, прекратите работу, как только вы обнаружите изменение, и просто отметьте, что кусок, отправленный в его entirity, чтобы обновить кусок на стороне сервера с тем же ID. Это может быть сделано еще эффективнее, если у вас есть какой-то быстрый алгоритм хэширования для ваших кусков, которые вы можете использовать для быстрого установления равенства.

Если последовательность ваших кусков не имеет значения, или если вы можете сохранить последовательность как свойство самих кусков, а не смоделировать по физической последовательности кусков, тогда вы можете даже закрепить свои куски по идентификатору. Затем обнаружение различий - это просто вопрос о перечислении ключей объекта A и поиск их на объекте B, а затем в Vice Versa. Это намного проще реализовать, чем "реальный" алгоритм diff, он имеет производительность O (a + b), которая (я думаю) лучше, чем сценарий наихудшего случая для реального алгоритма diff, который вы, скорее всего, получите, если вы "пытаться реализовать его самостоятельно или получить плохую реализацию.

Ответ 2

EtherPad разрешил что-то вроде этого, превратив каждое изменение источника в математическую операцию, которая может быть коммутативной, ассоциативной и т.д. Я бы рассмотрим эту нетривиальную проблему, и EtherPad смог сформировать бизнес вокруг решения этой проблемы.

edit: достаточно интересно, это именно та проблема, что хороший DVCS, например, Git, просто не в браузере.

Ответ 3

Сегодня я публикую небольшой плагин jQuery, делающий разницу между двумя объектами JS. http://plugins.jquery.com/project/jquery-diff

Я использую его в приложении для отправки на серверный сервер только измененных данных.

Ответ 4

Это не JSON, но метод Google, похоже, используется для Документов (их версия вышеупомянутой проблемы Etherpad).

http://code.google.com/p/google-diff-match-patch/

Это не было бы JSON, но это позволило бы вам создать эффективную клиентскую консоль diff в JavaScript и применить ее к серверу с помощью соответствующей реализации (Java, JavaScript, С++, С#, Objective C, Lua, или Python).

Этот ответ на другой вопрос может быть полезен, особенно часть измененной версии google-diff-match-patch: Разнообразный JSON

Ответ 5

зачем создавать diff в первую очередь, не было бы более эффективным подключиться к событиям, которые изменяют ваши данные и генерируют измененный набор данных на основе изменений? Поскольку ваш код будет встроен в браузер, вы будете ограничены JavaScript, поэтому генерация diff может привести к снижению производительности вашего приложения.

Ответ 6

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

Мне любопытно, что там; Я боролся с этим тем же вопросом, идея "куска" в ответе @Breton - это то, куда я иду, но не знаю, как это сделать.

edit: wait - я получил это назад, я думал, что вы говорите о том, что сервер вычисляет diff для отправки клиенту.

Возможно, вы могли бы смутно описать структуру данных на клиенте, отправленных на сервер. Я бы не сделал этого на основе самого текста JSON, если это вообще возможно; делать различия в пределах Javascript. Если это список элементов с известной структурой, отследите, какие из них вы отправили на сервер, и отправьте остальные. Если это более сложный набор данных, не знаете, как вам помочь.