2011-10-04 20 views
5

私はBLOBストレージにXMLファイルを格納していますが、それらを更新する(および/またはそれらにいくつかの要素を追加する)最も効率的な方法を理解しようとしています。Azure - BLOBストレージ内の既存のxmlファイルを更新する

  1. BLOB 取引:私は効率を考慮し、これらのパラメータで探しています

    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);      
         }        
    } 
    

    :WebRoleでは、私はこれを思い付きました。

  2. 帯域幅。 (コードがデータセンターで実行されているため、カウントされているかどうかはわかりません)
  3. メモリ消費量がインスタンス上にあります。

いくつかのものはもちろんのこと:

  • 私のxmlファイルは約150〜200キロバイトです。

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

  • blob.Delete()について、ブロブストレージ にアップロードされたxmlは、その末尾にいくつかの終了タグがないようです。私は と仮定しましたが、これは古いデータとの衝突が原因です。私はここで完全に間違って することができますが、それを解決して使用して(それ以上のトランザクション コストがかかります)それを解決。

私が提供したコードは良い練習ですか、あるいは私が言及したパラメータを考慮してもっと効率的な方法が存在しますか?

答えて

4

ストリームベースの方法の問題は、ストレージクライアントがデータの送信を開始するまでのストリームの長さがわからないことです。これにより、コンテンツの長さが更新されず、ファイルの最後に欠落したデータが表示される可能性があります。

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 

また、あなたが最初の場所でそれをダウンロードせずに、ファイルを再作成することができれば(私たちは時々これを行うことができます)、その後、あなたはそれをアップロードし、一つのストレージトランザクションを使用して、古いものを上書きすることができます。

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

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

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

あまりにも解決しすぎるかどうかはわかりません。それについて考える。あなたがホースを通して飛んでいる間、どのようにkoolaidを水に加えますか?それがストリームなのです。それがコンテナに入るまで待つ方がいいです。

それ以外では、編集(ビジネス上の問題)ではなく、効率(技術的な問題)に焦点を当てる理由は何ですか?パフォーマンスを重視するために文書が頻繁に変更されていますか?それとも、必要以上に多くのことをする通常の開発者傾向に陥るだけですか? (注:私はこの分野でもしばしば有罪です。)

Flush()の概念がないと、削除は一見すると受け入れ可能なオプションです。私はasynchメソッドへの移行が少ないオーバーヘッドで同じ目的を促進するかどうかはわかりません。

+0

文書は頻繁に変更されます。実際は非常に頻繁に。潜在的にそれらは1分と言い換えて何度も変更することができます。 –

+0

パフォーマンスを向上させる方法についてのご意見はありますか? –

関連する問題