Я использую приведенный ниже код, чтобы рекурсивно получить все пути в папке и поместить их один за другим в корзину облачного хранилища Google. Проблема в том, что это очень медленно. У меня есть около 30-40 тысяч файлов, которые нужно отправлять каждый день, и каждый из них занимает от 0,25 до 0,5 секунды. Есть ли способ, которым я мог бы собрать их все вместе? Оптом? Или другой способ, который делает это намного быстрее?
const {Storage} = require('@google-cloud/storage');
const fs = require('fs');
const path = require('path');
function getAllFilesInDirectoryRecursively(dir){
const files = fs.readdirSync(dir, {withFileTypes: true});
for (const file of files) {
if (file.isDirectory()) {
yield* getAllFilesInDirectoryRecursively(path.join(dir, file.name));
} else {
yield path.join(dir, file.name);
}
}
}
const storage = new Storage();
(async function(){
for (let filePath of getAllFilesInDirectoryRecursively('./main/')) {
await storage.bucket('bucket.domain.com').upload('./' + filePath, {
destination: filePath.replace('main', ''),
});
}
})()
@Dharmaraj Да, это работает, но это часть задания cron, поэтому нам нужно запускать его каждый день. Мы могли бы сделать это через exec()
, но разве это не ненадежно?
Откуда вы загружаете файлы (локальный компьютер, виртуальная машина и т. д.)? Вы можете просто запланировать задание cron, которое запускает команду gcloud
каждый день.
@Dharmaraj Это для виртуальной машины, да, как я уже сказал, это решение, которое у меня есть, но оно ненадежно. Отправка в облако должна происходить после огромного блока кода, который генерирует файлы, и что 1) Использование cronjob вне области действия не является хорошим решением, поскольку мы не знаем, когда именно заканчивается создание файлов 2) Использование его внутри cronjob через exec также не является хорошим решением, поскольку exec ненадежен.
Вы все еще можете запустить команду gsutil
после того, как файлы будут сгенерированы кодом? Если скрипт на NodeJS, то это должно помочь.
@Dharmaraj Думаю, это единственное решение, которое у меня есть, пока Google не создаст функцию, которая объединяет их все вместе. Спасибо.
Вы можете использовать gsutil для загрузки содержимого каталога, используя:
gsutil cp -r ./main gs://bucket-name
Чтобы периодически запускать эту команду, вы можете использовать задание cron или запустить команду из скрипта NodeJS после того, как файлы будут сгенерированы.
Для решения без gsutil
может быть лучше использовать Promise.all() вместо запуска всех upload
промисов по отдельности.
Пробовали ли вы использовать
gcloud
CLI, если это разовая работа?gsutil cp -r ./main gs://bucket-name