Azure - обновление существующего XML-файла в хранилище больших двоичных объектов - PullRequest
5 голосов
/ 05 октября 2011

У меня есть файлы XML, хранящиеся в хранилище больших двоичных объектов, и я пытаюсь выяснить, как наиболее эффективно обновить их (и / или добавить к ним некоторые элементы). В 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 КБ.

  • Мне известно о том, что XDocument загружает весь файл в памяти, и работа в потоках (XmlWriter и XmlReader) может решить это. Но я предполагаю, что это потребует работы с BlobStream что может привести к снижению эффективности транзакций (я думаю).

  • О blob.Delete (), без него, загруженный XML в хранилище BLOB-объектов Похоже, что в конце отсутствуют некоторые закрывающие теги. Я предположил это вызвано столкновением со старыми данными. я мог бы быть совершенно неправильно здесь, но с помощью удаления решил (стоит один больше транзакций)

Является ли предоставленный мною код хорошей практикой или, возможно, существует более эффективный способ с учетом упомянутых мною параметров?

Ответы [ 2 ]

5 голосов
/ 14 марта 2012

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

Работа с содержимым блоба в текстовом формате поможет. Вы можете загрузить содержимое 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 голос
/ 05 октября 2011

Мне известно о том, что XDocument загружает весь файл в память, и работа в потоках (XmlWriter и XmlReader) может решить эту проблему.

Не уверен, что это решит слишком много,Думаю об этом.Как добавить коалаид в воду, пока она летит по шлангу?Вот что такое поток.Лучше подождать, пока он не окажется в контейнере.

Помимо этого, в чем причина сосредоточенности на эффективности (техническая проблема), а не на редактировании (бизнес-проблема)?Достаточно ли часто меняются документы, чтобы можно было серьезно взглянуть на результативность?Или вы просто становитесь жертвой обычной тенденции разработчика делать больше, чем нужно?(ПРИМЕЧАНИЕ: я часто виновен и в этой области)

Без концепции Flush (), Delete, на первый взгляд, является приемлемым вариантом.Я не уверен, что переход к асинхронным методам может способствовать тому же результату с меньшими издержками.

...