У меня есть функция C # Azure для чтения содержимого файла из Blob и записи его в место назначения Azure Data Lake.Код прекрасно работает с файлами большого размера (~ 8 МБ и выше), но с файлами небольшого размера файл назначения записывается с 0 байтами.Я попытался изменить размер чанка на меньшее число и параллельные потоки на 1, но поведение остается тем же.Я имитирую код из Visual Studio 2017.
Пожалуйста, найдите фрагмент кода, который я использую.Я просмотрел документацию по ограничениям Parallel.ForEach, но не сталкивался с чем-то конкретным в вопросах размера файла(https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/potential-pitfalls-in-data-and-task-parallelism)
int bufferLength = 1 * 1024 * 1024;//1 MB chunk
long blobRemainingLength = blob.Properties.Length;
var outPutStream = new MemoryStream();
Queue<KeyValuePair<long, long>> queues = new
Queue<KeyValuePair<long, long>>();
long offset = 0;
while (blobRemainingLength > 0)
{
long chunkLength = (long)Math.Min(bufferLength, blobRemainingLength);
queues.Enqueue(new KeyValuePair<long, long>(offset, chunkLength));
offset += chunkLength;
blobRemainingLength -= chunkLength;
}
Console.WriteLine("Number of Queues: " + queues.Count);
Parallel.ForEach(queues,
new ParallelOptions()
{
//Gets or sets the maximum number of concurrent tasks
MaxDegreeOfParallelism = 10
}, (queue) =>
{
using (var ms = new MemoryStream())
{
blob.DownloadRangeToStreamAsync(ms, queue.Key,
queue.Value).GetAwaiter().GetResult();
lock (mystream)
{
var bytes = ms.ToArray();
Console.WriteLine("Processing on thread {0}",
Thread.CurrentThread.ManagedThreadId);
mystream.Write(bytes, 0, bytes.Length);
}
}
});
Цените всю помощь !!