Теперь меня беспокоит, до какой даты капли копируются в целевой каталог. Это дата начала работы или дата окончания работы?
Насколько я знаю, когда вы запускаете метод CopyDirectory, он просто отправляет запрос, чтобы указать учетной записи хранения Azure копировать файлы из другой учетной записи хранения. Все операции копирования выполняются в лазурном хранилище.
Если мы запустим метод, чтобы начать копирование каталога, лазурное хранилище сначала создаст файл с размером 0, как показано ниже:
![введите здесь описание изображения](https://i.stack.imgur.com/rewy4.png)
После завершения работы вы обнаружите, что размер изменился, как показано ниже:
![введите здесь описание изображения](https://i.stack.imgur.com/RbiMI.png)
Таким образом, если задание запущено, оно создаст файл в целевом каталоге, но размер файла равен 0. Вы можете увидеть время последнего изменения файла image1.
Хранилище Azure продолжит копирование содержимого файла в целевой каталог.
Если задание завершено, оно изменит время последнего изменения файла.
Таким образом, DML SDK просто указывает хранилищу копировать файлы, а затем продолжает отправлять запрос в хранилище Azure для проверки состояния копирования каждого файла.
Как показано ниже:
![введите здесь описание изображения](https://i.stack.imgur.com/SsVdK.png)
Спасибо. Но что произойдет, если файлы добавятся в исходный каталог во время этой операции копирования? Копируются ли новые файлы в целевой каталог?
Кратко ответ Да.
DML не получит весь список больших двоичных объектов и не отправит запрос на копирование всего файла за один раз.
Сначала он получит часть списка имен файлов и отправит запрос, чтобы указать файл копии хранилища.
Список сортируется по имени файла.
Например.
Если DML уже скопировал имя файла, например 0, как показано ниже.
Эта целевая папка больших двоичных объектов
![введите здесь описание изображения](https://i.stack.imgur.com/46GBB.png)
Если вы добавите начальный файл 0 в свою папку, он не будет скопирован.
Это копия из папки blob.
![введите здесь описание изображения](https://i.stack.imgur.com/RWyb9.png)
Скопируйте полностью папку blob:
![введите здесь описание изображения](https://i.stack.imgur.com/MTSXm.png)
Если вы добавите файл в конец папки больших двоичных объектов, а DML не просканирует его, он будет скопирован в новую папку.
поэтому за эти 2 недели в контейнер должно быть добавлено не менее миллиона BLOB-объектов с очень случайными именами. Итак, я думаю, что DML не работает в случае больших контейнеров?
Насколько мне известно, DML предназначен для высокопроизводительной загрузки, скачивания и копирования BLOB-объектов и файлов Azure Storage.
Когда вы используете DML CopyDirectoryAsync для копирования файла большого двоичного объекта. Сначала он отправит запрос на перечисление текущего файла папки, а затем отправит запрос на копирование файла.
По умолчанию операция, отправляющая запрос на перечисление текущего номера файла папки, равна 250.
После получения списка он сгенерирует маркер, который является следующим именем файла поиска больших двоичных объектов. Он начнет перечислять имя следующего файла в папке и снова начнет копирование.
По умолчанию ограничение HTTP-соединений .Net равно 2. Это означает, что можно поддерживать только два одновременных соединения.
Это означает, что если вы не установите лимит HTTP-подключения .Net, CopyDirectoryAsync просто получит 500 записей и начнет копирование.
После полного копирования начнется копирование следующих файлов.
Вы могли видеть эти изображения:
![введите здесь описание изображения](https://i.stack.imgur.com/AiSCz.png)
Маркер:
![введите здесь описание изображения](https://i.stack.imgur.com/lvzCD.png)
Я предлагаю вам сначала установить максимальное количество http-соединений, чтобы обнаружить больше файлов больших двоичных объектов.
ServicePointManager.DefaultConnectionLimit = Environment.ProcessorCount * 8;
Кроме того, я предлагаю вам создать несколько папок для хранения файлов.
Например, вы можете создать папку, в которой хранятся файлы за одну неделю.
На следующей неделе вы можете начать новую папку.
Затем вы можете сделать резервную копию файла старой папки без сохранения новых файлов в этой папке.
Наконец, вы также можете написать свой собственный код для достижения ваших требований, вам сначала нужно получить список файлов папки.
Максимальный результат одного запроса на получение списка — 5000.
Затем вы можете отправить запрос, чтобы сообщить хранилищу копию каждого файла.
Если файл загрузить в папку после получения списка, он не будет скопирован в новую папку.
person
Brando Zhang
schedule
16.06.2017