8

XML ファイルを BLOB ストレージに保存しており、それらを更新する (および/またはいくつかの要素を追加する) 最も効率的な方法を見つけようとしています。WebRole で、私はこれを思いつきました:

using (MemoryStream ms = new MemoryStream())
{                    
      var blob = container.GetBlobReference("file.xml");
      blob.DownloadToStream(msOriginal);
      XDocument xDoc= XDocument.Load(ms);  

      // Do some updates/inserts using LINQ to XML.  

      blob.Delete();//Details about this later on.

      using(MemoryStream msNew = new MemoryStream())  
      {
           xDoc.Save(msNew);
           msNew.Seek(0,SeekOrigin.Begin);
           blob.UploadFromStream(msNew);                    
      }                               
}

効率を考慮して、これらのパラメーターを検討しています。

  1. BLOBトランザクション
  2. 帯域幅。(コードはデータセンターで実行されるため、カウントされているかどうかはわかりません)
  3. インスタンスのメモリ消費。

言及すべきいくつかのこと:

  • 私の xml ファイルは約 150 ~ 200 KB です。

  • XDocument がファイル全体をメモリにロードし、ストリーム ( XmlWriter および XmlReader ) で作業することでこれを解決できるという事実を認識しています。しかし、これにはBlobStreamを使用する必要があり、トランザクションの効率が低下する可能性があると思います(私は思います)。

  • blob.Delete() については、それがないと、ブロブ ストレージにアップロードされた xml の末尾にいくつかの終了タグが欠落しているようです。これは、古いデータとの衝突が原因であると想定しました。ここでは完全に間違っている可能性がありますが、削除を使用すると解決しました(ただし、トランザクションが1つ増えます)。

私が提供したコードは良い習慣ですか、それとも私が言及したパラメータを考慮してより効率的な方法が存在するのでしょうか?

4

2 に答える 2

8

ストリーム ベースの方法の問題は、データの送信を開始する前に、ストレージ クライアントがストリームの長さを認識できないことにあると思います。これにより、コンテンツの長さが更新されず、ファイルの末尾にデータが欠落しているように見える可能性があります。

BLOB のコンテンツをテキスト形式で操作すると役立ちます。BLOB のコンテンツをテキストとしてダウンロードしてから、テキストとしてアップロードできます。これを行うと、削除を回避し (トランザクションを 1/3 節約できます)、コードをより単純にすることができます。

var blob = container.GetBlobReference("file.xml");
var xml = blob.DownloadText(); // transaction 1
var xDoc= XDocument.Parse(xml);

// Do some updates/inserts using LINQ to XML.

blob.UploadText(xDoc.ToString()); //  transaction 2

さらに、最初にファイルをダウンロードせずにファイルを再作成できる場合 (時々これを行うことができます)、ファイルをアップロードして、1 つのストレージ トランザクションを使用して古いファイルを上書きすることができます。

var blob = container.GetBlobReference("file.xml");
var xDoc= new XDocument(/* generate file */);

blob.UploadText(xDoc.ToString()); // transaction 1
于 2012-03-14T04:53:23.810 に答える
1

XDocument がファイル全体をメモリにロードし、ストリーム ( XmlWriter および XmlReader ) で作業することでこれを解決できるという事実を認識しています。

それがあまりにも解決するかどうかはわかりません。考えてみてください。ホースの中を飛んでいる間にクーレイドを水に加える方法. それがストリームです。コンテナに入るまで待ったほうがいいです。

それ以外では、編集 (ビジネス上の問題) ではなく効率性 (技術的な問題) に焦点を当てる理由は何ですか? ドキュメントは、パフォーマンスを真剣に検討するのに十分な頻度で変更されていますか? それとも、必要以上のことをする通常の開発者の傾向の餌食になっているだけですか? (注:私もこの分野で罪を犯すことがよくあります)

Flush() の概念がなければ、一見すると、Delete は受け入れられるオプションです。非同期メソッドに移行することで、より少ないオーバーヘッドで同じ目的を達成できるかどうかはわかりません。

于 2011-10-04T21:07:01.880 に答える