C# 如何跟踪无序的单个对象,然后连接连续对象?

C# 如何跟踪无序的单个对象,然后连接连续对象?,c#,bytearray,azure-storage,value-type,azure-storage-blobs,C#,Bytearray,Azure Storage,Value Type,Azure Storage Blobs,首先,我要说的是,将比盲目地将byte[]连接在一起要困难一些 我的主要目标是优化当前将许多512byte页面上传到web服务器(Azure页面Blob)的应用程序,并将其减少到4meg或更少的单个大型上传。有关原因的更多背景信息,请参见此问题底部的链接 原因的简短回答是:通过使用Azure稀疏文件,此优化将提高速度(减少IOs)并长期节省资金 现在了解详细信息: 这个班需要 接受数据并将其存储(定义为校准开始,校准停止,以及伴随的有效负载的数据) 在N个数据块到达后,或发生事件后,Proce

首先,我要说的是,将比盲目地将
byte[]
连接在一起要困难一些

我的主要目标是优化当前将许多512byte页面上传到web服务器(Azure页面Blob)的应用程序,并将其减少到4meg或更少的单个大型上传。有关原因的更多背景信息,请参见此问题底部的链接

原因的简短回答是:通过使用Azure稀疏文件,此优化将提高速度(减少IOs)并长期节省资金

现在了解详细信息:

这个班需要

  • 接受数据并将其存储(定义为
    校准开始
    校准停止
    ,以及伴随的有效负载的数据)

  • 在N个数据块到达后,或发生
    事件后,
    ProcessData()
    。这意味着是时候根据边界组装数据了(blob1
    的停止值必须与blob2的开始值对齐)

  • 连续数据实际上可能会无序到达

  • 非连续数据定义为调用应用程序在
    processData()
    发生之前不发送数据。此外,如果整个512字节范围==零,则该数据将得到特殊处理,并被视为非连续数据

  • 我们处理的是字节[]的类型,所以这里的高效列表可能很复杂。我希望避免不必要的拷贝和数组扩展

有道理吗?(我希望不会像泥一样)

到目前为止,我最接近的方法是编写方法签名:(我知道这很蹩脚)

//这不能大于4Mb,也不能小于512
字节[]BigBlobToUpload=新字节[];
/// 
///收集将上载的连续数据范围
/// 
///目标的名称(每个主机唯一)
///要收集的数据,以512K的倍数表示
///存储在要包括的范围内的数据的“起点”或偏移量。几乎总是0。
///长度,或要包括的范围的结尾。几乎总是512。
///此数据的位置应放置在BigBlobToUpload全局变量中,以便最终上载
私有void AddToQueue(目标的字符串名称,字节[]范围,int-offsetotransfer,int-sizeToTransfer,int-cloudOffset)
{
}
我只需要有人给我一个如何有效跟踪这些东西的方向…我可以从那里处理它。即使是一个抽象的方向也会有所帮助

有人能告诉我该怎么做吗 跟踪并有条件地连接连续的数据范围


更不用说,我正在尝试使用高效的逻辑,只在需要时扩展或复制阵列。

你能解释一下:“这比盲目地将byte[]连接在一起要困难一些,因为应用程序可能会跳过一个范围,以利用Azure的稀疏文件系统。(不需要写零,也不需要付费)?@GianT971每次我在512字节对齐的边界上得到所有零时,我都需要跳过,而不是上传。这可能是因为主机写入所有零,或者只是省略数据,而不是调用我的函数。这就是为什么我认为我需要跟踪每个512字节页面的开始/结束点…然后在每个发送的页面上迭代,concatenate和send。我不确定如何跟踪(或开始)。相关的有趣。因此,您的范围可以细分为512字节的块,所有为零的块都将被删除,对吗?基本上,但由于主机可能希望实际擦除保存的数据,我将发出一个特殊的
页面清除
标题来擦除该范围。我想我将跟踪连续的页面清除这与我跟踪有效数据时使用的模式相同。结果只会有所不同。您能否解释一下:“这比盲目地将字节[]连接在一起要困难一些,因为应用程序可能会跳过一个范围,以利用Azure的稀疏文件系统。(不需要写零,也不需要付费)?@GianT971每次我在512字节对齐的边界上得到所有零时,我都需要跳过,而不是上传。这可能是因为主机写入所有零,或者只是省略数据,而不是调用我的函数。这就是为什么我认为我需要跟踪每个512字节页面的开始/结束点…然后在每个发送的页面上迭代,concatenate和send。我不确定如何跟踪(或开始)。相关的有趣。因此,您的范围可以细分为512字节的块,所有为零的块都将被删除,对吗?基本上,但由于主机可能希望实际擦除保存的数据,我将发出一个特殊的
页面清除
标题来擦除该范围。我想我将跟踪连续的页面清除这与我跟踪有效数据时使用的模式相同。结果操作只会有所不同。
// This can't be bigger than 4Mb, or smaller than 512
byte[] BigBlobToUpload = new byte[];

    /// <summary>
    /// Collects consecutive data ranges that will be uploaded
    /// </summary>
    /// <param name="NameOfTarget">The name of the target (unique per host)</param>
    /// <param name="range">The data to be collected, in 512K multiples</param>
    /// <param name="offsetToTransfer">The "start point" or offset of the data stored in range to be included. Almost always 0.</param>
    /// <param name="sizeToTransfer">The length, or end of the range to include.  Almost always 512.</param>
    /// <param name="cloudOffset">The location this data should be placed in the BigBlobToUpload  global var for eventual upload</param>

private void AddToQueue(string NameOfTarget, byte[] range, int offsetToTransfer, int sizeToTransfer, int cloudOffset)
{

}