2011-10-04 28 views
5

Tôi có tệp XML được lưu trữ trong bộ nhớ BLOB và tôi đang cố gắng tìm ra cách hiệu quả nhất để cập nhật chúng (và/hoặc thêm một số yếu tố cho chúng). Trong một WebRole, tôi đến với điều này:Azure - Cập nhật tệp xml hiện có trong bộ nhớ 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);      
     }        
} 

tôi đang xem xét các thông số này xem xét tính hiệu quả:

  1. BLOB Giao dịch.
  2. Băng thông. (Không chắc liệu nó có được tính hay không, vì mã chạy trong trung tâm dữ liệu)
  3. Bộ nhớ tiêu thụ trên ví dụ.

Một số điều cần đề cập đến:

  • file xml của tôi là khoảng 150-200 KB.

  • Tôi nhận thức được thực tế là XDocument tải toàn bộ tập tin vào bộ nhớ , và làm việc tại suối (XmlWriter và XmlReader) có thể giải quyết này. Nhưng tôi Giả sử điều này sẽ yêu cầu làm việc với BlobStream có thể dẫn đến ít giao dịch hiệu quả hơn (tôi nghĩ).

  • Giới thiệu blob.Delete(), không có nó, xml đã tải lên trong bộ nhớ blob dường như thiếu một số thẻ đóng ở cuối thẻ. Tôi giả định điều này là do va chạm với dữ liệu cũ. Tôi có thể là hoàn toàn sai ở đây, nhưng bằng cách sử dụng xóa đã giải quyết nó (chi phí một giao dịch nhiều hơn mặc dù).

Mã tôi cung cấp là phương pháp hay hoặc có thể là cách hiệu quả hơn khi xem xét các thông số tôi đã đề cập?

Trả lời

4

Tôi tin rằng vấn đề với phương pháp dựa trên luồng là khách hàng lưu trữ không biết luồng này dài bao lâu trước khi bắt đầu gửi dữ liệu. Điều này có thể khiến nội dung không được cập nhật, cho sự xuất hiện của dữ liệu bị thiếu ở cuối tệp.

Làm việc với nội dung của đốm màu ở định dạng văn bản sẽ giúp ích. Bạn có thể tải xuống nội dung blob dưới dạng văn bản và sau đó tải lên dưới dạng văn bản. Làm điều này, bạn sẽ có thể vừa tránh được việc xóa (lưu bạn 1/3 các giao dịch) và có mã đơn giản hơn.

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 

Ngoài ra, nếu bạn có thể tạo lại tệp mà không tải xuống ngay lúc đầu), bạn có thể tải lên và ghi đè tệp cũ bằng cách sử dụng một giao dịch lưu trữ.

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

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

Tôi biết thực tế là XDocument tải toàn bộ tệp vào bộ nhớ và làm việc trong luồng (XmlWriter và XmlReader) có thể giải quyết vấn đề này.

Không chắc chắn nó sẽ giải quyết quá nhiều. Hãy suy nghĩ về nó. Làm thế nào để bạn thêm koolaid vào nước trong khi nó đang bay qua ống. Đó là những gì một dòng. Tốt hơn là đợi cho đến khi nó ở trong một thùng chứa.

Ngoài lý do đó, lý do tập trung vào hiệu quả (vấn đề kỹ thuật) thay vì chỉnh sửa (vấn đề kinh doanh) là gì? Các tài liệu có thay đổi thường xuyên đủ để đảm bảo một cái nhìn nghiêm túc về hiệu suất không? Hay bạn chỉ là con mồi để xu hướng phát triển bình thường làm nhiều hơn những gì cần thiết? (LƯU Ý: Tôi cũng thường phạm tội trong khu vực này)

Nếu không có khái niệm về Flush(), thì tùy chọn Xóa là một tùy chọn có thể chấp nhận được, ngay từ cái nhìn đầu tiên. Tôi không chắc chắn nếu di chuyển đến các phương pháp asynch có thể tạo thuận lợi cho cùng một kết thúc với chi phí ít hơn.

+0

Tài liệu thường xuyên thay đổi. Trên thực tế rất thường xuyên. Có khả năng chúng có thể thay đổi nhiều lần, giả sử, một phút. –

+0

Bất kỳ ý tưởng nào về cách cải thiện hiệu suất? –

Các vấn đề liên quan