C # Параллельное копирование - проблема с файлами небольшого размера - PullRequest
0 голосов
/ 12 июня 2018

У меня есть функция 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);

                        }

                }
             });

Цените всю помощь !!

1 Ответ

0 голосов
/ 12 июня 2018

Я обнаружил проблему с моим кодом.Устройство записи ADL Stream не очищено и не утилизировано должным образом.После добавления необходимого кода распараллеливание с маленькими / большими файлами работает нормально.

Спасибо за предложения !!

...