2011-10-04 18 views
5

Tengo archivos XML almacenados en el almacenamiento BLOB, y estoy tratando de averiguar cuál es la forma más eficiente de actualizarlos (y/o agregar algunos elementos a ellos). En una WebRole, se me ocurrió esto:Azure - Actualización de un archivo xml existente en el almacenamiento 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);      
     }        
} 

Estoy mirando estos parámetros teniendo en cuenta la eficiencia:

  1. BLOB Transacciones.
  2. Ancho de banda. (No estoy seguro si se cuenta, porque el código se ejecuta en el centro de datos)
  3. Memoria consumo en la instancia.

Algunas cosas que mencionar:

  • Mis archivos XML son alrededor de 150-200 KB.

  • Soy consciente del hecho de que XDocument carga todo el archivo en la memoria , y trabajando en arroyos (XmlWriter y XmlReader) podrían solucionar esto. Pero supongo que esto requerirá trabajar con BlobStream , lo que podría llevar a una transacción menos eficiente (creo).

  • Acerca de blob.Delete(), sin él, el xml cargado en el almacenamiento de blobs parece que le faltan algunas etiquetas de cierre al final. Supuse esto es causado por una colisión con los datos anteriores. Podría ser completamente incorrecto aquí, pero usando el borrado lo resolvió (aunque le costó una transacción más ).

es el código que se proporciona una buena práctica o tal vez de una manera más eficiente existe teniendo en cuenta los parámetros que he mencionado?

Respuesta

4

Creo que el problema con el método basado en secuencias es que el cliente de almacenamiento no sabe cuánto tiempo dura la transmisión antes de que comience a enviar los datos. Esto probablemente esté causando que la longitud del contenido no se actualice, dando la apariencia de que faltan datos al final del archivo.

Trabajar con el contenido del blob en formato de texto ayudará. Puede descargar el contenido del blob como texto y luego cargarlo como texto. Al hacer esto, debería poder evitar la eliminación (ahorrándole 1/3 de las transacciones) y tener un código más simple.

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 

Además, si puede volver a crear el archivo sin necesidad de descargarlo en el primer lugar (que podemos hacer esto a veces), a continuación, puedes subirlo y sobrescribir el anterior utilizando una transacción de almacenamiento.

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

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

Soy consciente del hecho de que XDocument carga todo el archivo en la memoria, y trabajar en flujos (XmlWriter y XmlReader) podría solucionar esto.

No estoy seguro de que pueda resolver demasiado. Piénsalo. ¿Cómo agregas koolaid al agua mientras vuela por la manguera? Eso es lo que es una corriente. Es mejor esperar hasta que esté en un contenedor.

Fuera de eso, ¿cuál es la razón del enfoque en la eficiencia (un problema técnico) en lugar de la edición (el problema de negocios)? ¿Se cambian los documentos con la frecuencia suficiente como para garantizar un análisis serio del rendimiento? ¿O simplemente caes presa de la tendencia normal del desarrollador de hacer más de lo necesario? (NOTA: a menudo también soy culpable en esta área)

Sin un concepto de Flush(), el borrado es una opción aceptable, a primera vista. No estoy seguro si pasar a los métodos de asincronización podría facilitar el mismo fin con menos sobrecarga.

+0

Los documentos cambian con frecuencia. En realidad muy a menudo. Potencialmente podrían cambiarse muchas veces en, digamos, un minuto. –

+0

¿Alguna idea sobre cómo mejorar el rendimiento? –

Cuestiones relacionadas