Эффективный способ расчета размеров объектов в папке ведра - PullRequest
0 голосов
/ 04 августа 2020

Как-то хочу получить общий размер папки для пользователя. В настоящее время я извлекаю все объекты в памяти, а затем зацикливаю их все, чтобы добавить размер.

let promises = []

// the format of Key is "storage/{USER ID}/docs"
for (const Key of keys) { 
      promises.push(new Promise(resolve => {
        engineS3.getObject({
          Bucket: process.env.ENGINE_AWS_BUCKET,
          Key
        }, (e, data) => {
          resolve(data)
        })

      }))
    }

let docs = await Promise.all(promises)

let usedSpace = docs.reduce((x, y) => x + y.ContentLength, 0) / (1024 * 1024 * 1024)

Для 2 3 документов (каждый из них находится в диапазоне от 3 до 10 МБ) все будет работать нормально. Но по мере роста числа пользователей и документов sh сервер может взломать недостаточные ресурсы.

1 Ответ

1 голос
/ 04 августа 2020

К сожалению, нет простого способа добиться этого, но вы можете использовать AWS команду CLI

Первое решение

Выполните следующую команду из вашего кода. Используйте пакет child_process или npm, например shell js. В этом случае вам также потребуется аутентифицировать интерфейс командной строки.

aws s3 ls s3://yourBucket/storage/{USER ID}/docs --recursive --human-readable --summarize

Это вернет такие данные:

2013-09-02 21:37:53   10 Bytes a.txt
2013-09-02 21:37:53  2.9 MiB foo.zip
2013-09-02 21:32:57   23 Bytes foo/bar/.baz/a
2013-09-02 21:32:58   41 Bytes foo/bar/.baz/b
2013-09-02 21:32:57  281 Bytes foo/bar/.baz/c
2013-09-02 21:32:57   73 Bytes foo/bar/.baz/d
2013-09-02 21:32:57  452 Bytes foo/bar/.baz/e
2013-09-02 21:32:57  896 Bytes foo/bar/.baz/hooks/bar
2013-09-02 21:32:57  189 Bytes foo/bar/.baz/hooks/foo
2013-09-02 21:32:57  398 Bytes z.txt

Total Objects: 10
Total Size: 2.9 MiB

И вы можете проанализировать его общий размер.

Второе решение

Используйте метод Node AWS SDK ListObjectsV2 . Уловка в том, что он возвращает только до 1000 результатов за один вызов и предоставляет маркер для следующей страницы. Вам нужно написать logi c для разбивки на страницы.

Результат будет:

{
    Contents: [
        {
            Key: "example1.jpg",
            // ... Other details
            Size: 11,
        },
        {
            Key: "example2.mp4",
            // ... Other details
            Size: 784335,
        },
    ],
    NextMarker: "eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAyfQ=="
}

Вам просто нужно добавить все размеры.

Третье решение

Если файлы выгружаются с вашей платформы, лучше всего сохранить размер содержимого где-нибудь в базе данных и выполнить запрос, чтобы получить размеры.

...