【发布时间】:2018-03-13 20:15:55
【问题描述】:
我有一个自定义流,用于直接对页面云 blob 执行写入操作。
public sealed class WindowsAzureCloudPageBlobStream : Stream
{
// 4 MB is the top most limit for page blob write operations
public const int MaxPageWriteCapacity = 4 * 1024 * 1024;
// Every operation on a page blob has to manipulate a value which is rounded up to 512 bytes
private const int PageBlobPageAdjustmentSize = 512;
private CloudPageBlob _pageBlob;
public override void Write(byte[] buffer, int offset, int count)
{
var additionalOffset = 0;
var bytesToWriteTotal = count;
List<Task> list = new List<Task>();
while (bytesToWriteTotal > 0)
{
var bytesToWriteTotalAdjusted = RoundUpToPageBlobSize(bytesToWriteTotal);
// Azure does not allow us to write as many bytes as we want
// Max allowed size per write is 4MB
var bytesToWriteNow = Math.Min((int)bytesToWriteTotalAdjusted, MaxPageWriteCapacity);
var adjustmentBuffer = new byte[bytesToWriteNow];
...
var memoryStream = new MemoryStream(adjustmentBuffer, 0, bytesToWriteNow, false, false);
var task = _pageBlob.WritePagesAsync(memoryStream, Position, null);
list.Add(task);
}
Task.WaitAll(list.ToArray());
}
private static long RoundUpToPageBlobSize(long size)
{
return (size + PageBlobPageAdjustmentSize - 1) & ~(PageBlobPageAdjustmentSize - 1);
}
我的性能较低 Write()。例如:
Stopwatch s = new Stopwatch();
s.Start();
using (var memoryStream = new MemoryStream(adjustmentBuffer, 0, bytesToWriteNow, false, false))
{
_pageBlob.WritePages(memoryStream, Position);
}
s.Stop();
Console.WriteLine(s.Elapsed); => 00:00:01.52 == Average speed 2.4 MB/s
如何改进我的算法?
如何使用Parallel.ForEach加快进程?
为什么只有 2.5 MB/秒,而不是 official site 或 http://blogs.microsoft.co.il/applisec/2012/01/05/windows-azure-benchmarks-part-2-blob-write-throughput/ 中的 60MB/秒
【问题讨论】:
-
如果你还没有检查,你可以检查how to efficiently upload and download page blobs
-
谢谢,但已经检查了
-
您没有提供完整的实现(例如,您在 Write 中使用的 Read 方法在哪里?)。另外,为什么你只测量单个语句 (_pageBlob.WritePages) 的性能,却询问整个解决方案的弱点?
-
@Evk 问题已更新
标签: c# performance azure azure-blob-storage