Проблема с чтением фрагментов в большом двоичном объекте Windows Azure

Все, я пытаюсь найти способ чтения BLOB-объекта из Windows Azure. Теперь у меня возникла проблема с этим, общий размер считанного фрагмента не равен общему размеру BLOB-объекта. Размер моего тестового большого двоичного объекта составляет 154805720 байт, а размер чтения каждого фрагмента составляет 10 * 1024 * 1024. Я обнаружил, что последний буфер прочитанного фрагмента не имеет предполагаемого размера 8005080 байт. Он всегда равен 4 МБ. Кстати, я загрузил этот большой двоичный объект в локальное хранилище Cloudbrerry. он того же размера, что и исходный файл, который я загрузил ранее. поэтому я уверен, что исходный размер BLOB-объекта в порядке, что означает 154805720 байт. Вот мой код. Пожалуйста, помогите просмотреть его.

        private static CloudBlobClient CreateBlobClient(StorageAccount account)
        {
            CloudBlobClient blobClient = null;
            CloudStorageAccount oStorageAccount = CreateStorageAccount(account);
            blobClient = oStorageAccount.CreateCloudBlobClient();
            blobClient.Timeout = new TimeSpan(2, 0, 0);
            blobClient.WriteBlockSizeInBytes = 4 * 1024 * 1024;
            blobClient.RetryPolicy = RetryPolicies.Retry(20, TimeSpan.Zero);

            return blobClient;
        }



        public static byte[] DownloadChunkFromBlob(StorageAccount account, string sContainerName, String sBlobName, int blobOffset, int bufferSize)
        {
            CloudBlobClient blobClient = CreateBlobClient(account);

            CloudBlobContainer container = blobClient.GetContainerReference(sContainerName);
            bool b = container.CreateIfNotExist();
            CloudBlob blob = container.GetBlobReference(sBlobName);

            using (var blobStream = blob.OpenRead())
            {
                var buffer = new byte[bufferSize];
                blobStream.Seek(blobOffset, SeekOrigin.Begin);
                int numBytesRead = blobStream.Read(buffer, 0, bufferSize);

                if (numBytesRead != bufferSize)
                {
                    var trimmedBuffer = new byte[numBytesRead];
                    Array.Copy(buffer, trimmedBuffer, numBytesRead);
                    return trimmedBuffer;
                }
                return buffer;
            }
        }

person Joe.wang    schedule 20.10.2012    source источник
comment
Можете ли вы подтвердить, запустив Fiddler, что вы можете прочитать 10 МБ за один раз для ваших начальных фрагментов. Взгляните на эту тему: stackoverflow.com/questions/6911728/, в котором упоминается, что OpenRead() может читать только до 4 МБ за один раз (см. Редактирование 2).   -  person Gaurav Mantri    schedule 20.10.2012
comment
Да, ваш комментарий полезен. Когда я отправляю кусок размером 4 МБ, все в порядке. Я делаю тест. В режиме 10 МБ я сохраняю каждый фрагмент во временный файл. размер каждого временного файла составляет 10 МБ, только последний фрагмент меньше 10 МБ, кажется, API лазурного блоба читает только 4 МБ. Это странно.   -  person Joe.wang    schedule 21.10.2012


Ответы (1)


Ответ: OpenRead() может читать только до 4 МБ за один раз. Когда я устанавливаю размер чанка для чтения, он составляет 4 МБ. Все отлично.

person Joe.wang    schedule 01.11.2012