1

警告、私は正しい質問をしているといいのですが、代替案を自由に提案してください。

状況; 主に JavaScript で記述された、固定デバイスとモバイル デバイスで実行されるサイトがあります。サイトはデータ量が多いです。移動するオブジェクトやその他の相互作用の負荷をマッピングします。各クライアントは数秒ごとにサーバーからデータの更新を受信するため、送信されるデータの量を最小限に抑える必要があります。現在、サーバーは更新ごとにすべてのオブジェクトの現在の状態を含むかなり大きなハッシュを送信します。データの大部分が変更されないままになるため、これは非常に非効率的です。

最小限のコーディングとテストで、送信されるデータの量に最大の違いをもたらすアプローチは、更新ごとに変更をハッシュにのみ送信することだと私は信じています。

それで、最後に送信されたデータ(ハッシュ)と送信されるデータ(ハッシュ)を比較し、違いを抽出し、その違いをハッシュに適用するための試行済みの方法があるかどうか疑問に思っていますJavaScript側?それが理にかなっていることを願っていますか?

比較とは、キーと値を意味します。現在、ハッシュは特定の方法で順序付けされていませんが、順序付けが必要な場合は問題ありません。

私は Data::Compare のようなものを見てきましたが、違いが何であるかではなく、ハッシュが異なるかどうかを教えてくれるようです (間違って読んでいない限り?)。

4

2 に答える 2

3

オブジェクトの差分 (JSON 形式) をサーバーからクライアントに送信する際に、やや高い頻度で同じ問題が発生しました。私たちが思いついた解決策はとてもシンプルでした。json オブジェクト間の違いを表現する公式または標準的な方法がないため、どのオブジェクトが追加され、どのオブジェクトが更新されたか (つまり、これらのオブジェクトのプロパティが変更された (追加/更新/削除) ) と、どのオブジェクトが完全に削除されたか。

可能性のあるデルタ ペイロードの 1 つとして、次のようなものがあります。

{
  added: [
    /* array of new objects */
  ],
  removed: [
    /* array of object identifiers that need to be removed */
  ],
  updated: { /* key value pairs of object identifiers with their property maps */
    obj_id_01: {
      updated: { /* key-value pairs of updated properties */ },
      removed: [ /* array of keys of removed properties in an object */ ]
    },
    obj_id_02: {
    },
    ...
  }
}
于 2012-05-25T15:54:55.767 に答える
1

同様の問題に対して同様のソリューションを開発しました..

my $bef = {
  name => 'Fred',
  wife => 'Wilma',
  hobby => 'Breaking Rocks',
  friends => [qw! Barney Wilma Betty !],
};

my $aft = { 
  name => 'Fred',
  pet => 'Dino',
  hobby => 'Bowling',
  friends => [qw! Barney Betty Dino !],
  kids => [qw! Bam Pebbles !],
};

my $differ = Lecstor::FeedProxy::Diff->new;

my $diff = $diff->differences($bef, $aft);

$diff: {
  'pet' => 'Dino',
  'wife' => undef,
  'hobby' => 'Bowling',
  'friends' => {
    'remove' => [ 'Wilma' ],
    'add' => [ 'Dino' ]
  },
  'kids' => {
    'add' => [ 'Bam', 'Pebbles' ]
  }
};

https://github.com/lecstor/Lecstor/blob/master/lib/Lecstor/FeedProxy/Diff.pm

于 2012-05-26T13:28:36.047 に答える