Я пытаюсь переместить 15 миллионов файлов (4 ТБ) из различных сегментов, используя gsutil mv
.К сожалению, предыдущие имена файлов не имеют общих общих префиксов ;вместо этого они все постфиксируются с нашими идентификаторами "filetype".
Во время этой передачи я также пытаюсь переименовать файлы, чтобы предотвратить этот беспорядок в будущем.
Это наш текущий формат файла:
gs://{bucket}/{hash}-{filetype}.{extn}
Этот формат я переименовываю в них:
gs://{bucket}/{filetype}/{hash}.{extn}
Текущее решение:
Поскольку текущий формат не подходит для «префиксных» селекторов, я должен сделать следующее:
let { stdout } = spawn('gsutil', ['ls', `${OLD_BUCKET}/*-${TYPE}`]);
createInterface({ input:stdout }).on('line', str => {
if (!str.length) return;
let [hash] = str.replace(OLD_BUCKET, '').split('-');
let nxt = `${NEW_BUCKET}/${TYPE}/${hash}.${extn}`;
spawnSync('gsutil', ['mv', str, nxt]);
});
Мягко отредактировано для краткости.
Как ни странно, gsutil ls
- единственная команда, которая распознает шаблоны на основе глобуса.Воспользовавшись этим, я передаю каждую строку в свой «преобразователь формата», а затем использую gsutil mv
для инициации передачи.
Это действие выполняется на 16-ядерном компьютере, причем каждое ядро выполняетта же задача - но ls
'с другим типом файла.
Проблема
Это невероятно медленно!
Я добавил больше серверов и больше ядер, и я не могу разбить 26 файлов в минуту на каждый тип файла.Я также попытался добавить флаг -m
к gsutil mv
без разницы - потому что mv
вызывается один раз на строку.
У нас есть 13 типов файлов;Таким образом, 20 280 файлов передаются в час.Сравните это с инструментом GCP «Transfer», который скопировал 5M файлов из BucketA в BackupA менее чем за час.
Вопрос
Есть ли способ ускорить это?
По текущему курсу я смотрю 15 дней до завершения перевода (ов), оплачивая по часам ?