【问题标题】:Uploading a File from OneDrive to Azure - issues with file content将文件从 OneDrive 上传到 Azure - 文件内容问题
【发布时间】:2018-02-18 03:01:29
【问题描述】:

我们编写了一个应用程序来将内容从 OneDrive 帐户移动到 Azure 存储。我们已经设法让它工作,但在处理大文件 (> 1GB) 和块 Blob 时遇到了内存问题。我们认为 Append Blob 是最好的方法,因为它可以解决内存问题。

我们正在使用对 SharePoint 的 RPC 调用来获取大文件的文件流,可以在此处找到更多信息: http://sharepointfieldnotes.blogspot.co.za/2009/09/downloading-content-from-sharepoint-let.html

将文件从 OneDrive 写入本地存储时,使用以下代码可以正常工作

using (var strOut = System.IO.File.Create("path"))
using (var sr = wReq.GetResponse().GetResponseStream())
{

    byte[] buffer = new byte[16 * 1024];
    int read;
    bool isHtmlRemoved = false;
    while ((read = sr.Read(buffer, 0, buffer.Length)) > 0)
    {
        if (!isHtmlRemoved)
        {
            string result = Encoding.UTF8.GetString(buffer);
            int startPos = result.IndexOf("</html>");
            if (startPos > -1)
            {
                //get the length of the text, '</html>' as well
                startPos += 8;

                strOut.Write(buffer, startPos, read - startPos);

                isHtmlRemoved = true;
            }
        }
        else
        {
            strOut.Write(buffer, 0, read);

        }
    }
}

这会创建具有正确大小的文件,但是当我们尝试将其写入 Azure 存储中的附加 blob 时,我们不会获得完整的文件,而在其他情况下会获得更大的文件。

using (var sr = wReq.GetResponse().GetResponseStream())
{

    byte[] buffer = new byte[16 * 1024];
    int read;
    bool isHtmlRemoved = false;
    while ((read = sr.Read(buffer, 0, buffer.Length)) > 0)
    {
        if (!isHtmlRemoved)
        {
            string result = Encoding.UTF8.GetString(buffer);
            int startPos = result.IndexOf("</html>");
            if (startPos > -1)
            {
                //get the length of the text, '</html>' as well
                startPos += 8;

                //strOut.Write(buffer, startPos, read - startPos);
                appendBlob.UploadFromByteArray(buffer, startPos, read - startPos);

                isHtmlRemoved = true;
            }
        }
        else
        {
            //strOut.Write(buffer, 0, read);
            appendBlob.AppendFromByteArray(buffer, 0, read);

        }
    }
}

这是正确的做法吗?为什么我们会得到不同的文件大小?

任何建议将不胜感激

谢谢

【问题讨论】:

    标签: c# azure sharepoint azure-storage onedrive


    【解决方案1】:

    回应“为什么我们会得到不同的文件大小?”:

    1. 来自CloudAppendBlob.appendFromByteArray documentation “此 API 应严格用于单个编写器场景 因为 API 在内部使用附加偏移量条件标头 避免在多个写入器中不起作用的重复块 场景。”如果您确实使用的是单个编写器,则需要 显式设置 BlobRequestOptions.AbsorbConditionalErrorsOnRetrytrue

    2. 您还可以检查您是否超过了 50,000 个已提交的块 限制。您的块大小相对较小,所以这是一个 文件足够大的可能性(> 16KB * 50,000 = .82 GB)。

    回应“这是正确的做法吗?”

    1. 如果您觉得需要使用 Append Blob,请尝试使用 CloudAppendBlob.OpenWrite 方法来实现与本地存储代码示例更相似的功能。

    2. 块 Blob 似乎更适合您的方案。您能否发布您用于上传 Block Blob 的代码?您应该能够上传到块 Blob 而不会耗尽内存。您可以并行上传不同的块以实现更快的吞吐量。使用 Append Blob 追加(相对)小块会导致顺序读取性能下降,因为目前追加的块没有进行碎片整理。

    如果这些解决方案对您有用,请告诉我!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 2017-01-03
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多