1

今日、私は最終的にクライアント(Windowsモバイルデバイス)を実行することに成功しました-wcf-SQLサーバー2008同期(多くの問題の後、主にMS部分)

私はテストをしました。24,000 レコードの場合、スナップショットの平均時間は約 1 分 20 秒かかります。Microsoft Sync for ADO.NET の修正プログラムをダウンロードした後の時間です。

また、50 秒後にデータベース ファイルが最終的に大きくなり始め、約 25 秒かかることも発見しました。

最初の 50 秒間、フレームワークは何をしているのか? データの読み込みとシリアル化?

あるページで、転送されるデータの量を減らすことができるサロゲート シリアライゼーションに関する記事を見つけました。

同期プロセスがこれによって恩恵を受けるかどうか知っていますか? (ホットフィックス後の Ado.net の MS Sync のことですか?)

プロセスをスピードアップするためにできることはありますか? 私の意見では、24000 の 1:24 は 2 倍多すぎます...

4

3 に答える 3

1

デバイスの同期フレームワークには、次の2つの大きな問題があります。

  1. ADO.NETデータセットを介してデータを交換します
  2. 「初期」同期で同期をサポートするためにクライアントデータベースをセットアップするには、クライアント側で多くのオーバーヘッドが発生します。
  3. 挿入に関しては、SQLCEは非常に低速です。

あなたが言及したホットフィックスは、可能な限りアドレス#3に対応しているため、他にできることはほとんどありません。

番号2は同期フレームワークの一部であり、恐れていることについては何もする必要はありません。

#1に関しては、これはその50秒(おそらく30秒程度?)の多くが使用されている場所です。クライアントがデータセットを受信すると、前にストリーム全体(ストリームが非常に冗長なXMLで構成されている場合)を逆シリアル化する必要があります処理を開始できます。大規模なデータセット(10,000行以上)の場合、これには長い時間がかかる可能性があり、使用可能なヒープメモリが最大になると、メモリクランチシナリオにつながる可能性があります(最終的にはそうなります)。

参照するシリアル化サロゲートメソッドは、交換される応答ストリームのサイズを大幅に削減します(私のテストでは、場合によってはほぼ90%小さくなりました)。これにより、特にネットワーク接続のスループットが制限されている場合に、応答時間がある程度改善されます。ただし、結局のところ、クライアント側の処理を開始する前に、そのストリームをDataSetに逆シリアル化する必要があるという事実を回避することはできません。

つまり、サロゲートシリアル化方式を使用すると、転送されるデータの量が減り、ある程度の改善が見込めますが、その量は次のような要因によって異なります。

  • データセットのサイズ
  • 使用可能なデバイスメモリの量
  • デバイスプロセッサの速度と可用性

お役に立てれば!

于 2012-09-13T17:06:10.580 に答える
1

同期すると、次の 3 つのことが起こります。 1. 発生した変更を列挙する必要があります。

  1. 宛先に送信する必要があります

  2. それを適用する必要があります

列挙の場合、データベースのサイズが大きな影響を与えます。また、変更がない場合でも、このチェックのためにパフォーマンスが低下します。

参照: ADO .NET for Devices の同期サービス: 同期を必要としないテーブルをスキップすることによるパフォーマンスの向上

項目 2 では、データセットのシリアル化がボトルネックです。Dataset のサロゲートや圧縮を使用することもできますが、サロゲートと圧縮を実行するとヒットし、大幅なパフォーマンスの向上が見られない場合があります。

参照:オフライン シナリオの Sync Framework WCF ベースの同期 – カスタム データセットのシリアル化の使用

項目 1 と 2 については、データベースに対して行っているのと同じパフォーマンス チューニングを適用できます。たとえば、フィルタリング、インデックスのチューニングなどを介して必要な行のみを同期します。

結局のところ、Sync Fx アプリは他のデータベース アプリと同じです。

于 2012-09-14T01:41:40.070 に答える
0

SyncFx 2.1 ライブラリ (SyncAgent ではなく SynchOrchestrator) を使用している場合、SyncFx は既に組み込みの DataSet Surrogate シリアル化を使用しています。

DataSet 関連のメモリ不足の問題を回避するために、バッチ処理を調べて、同期ごとに送信できるレコード数を制限する方法を見つけることができます。SyncFx ライブラリのどちらのセットでもある程度は実行できますが、1.0 ライブラリよりも 2.1 ライブラリの方が少し確定的です*。

*deterministic: 2.1 ライブラリでは、最大バイト数を指定できます。SyncFx は、その制限内に収まる最後の完全な行で自動的に切り捨てます。1.0 ライブラリでは、バッチ処理を行う唯一の方法は、最大行数を指定し、データが達成したい制限を超えないことを期待する (または慎重に計算する) ことだと思います。

于 2012-09-13T18:56:26.960 に答える