Google Cloud Storage - создавайте множество копий одного объекта / файла - PullRequest
1 голос
/ 05 июня 2019

Я хочу сделать миллион копий одного файла. Прямо сейчас я перебираю и создаю копию по одному, что занимает около секунды на файл (используя bash). Есть ли лучший / более быстрый способ сделать это?

for f in {1..1000000}; gsutil cp gs://BUCKET_NAME/FILENAME.csv "gs://BUCKET_NAME/FILENAME_${f}.csv"; done

Ответы [ 3 ]

2 голосов
/ 05 июня 2019

Вы можете использовать команду parallel , чтобы сделать это намного быстрее. Например, это создаст 1 миллион объектов, ограниченный 100 экземплярами gsutil, запущенными одновременно:

seq 1000000 | parallel --jobs 100 gsutil cp gs://BUCKET_NAME/FILENAME.csv \
    "gs://BUCKET_NAME/FILENAME_{}.csv"
1 голос
/ 05 июня 2019

То, как Jas написал это лучше, чем любой из двух других ответов, потому что он использует копирование в облаке. Оба эти ответа каждый раз загружаются в облако.

Чтобы сделать это быстрее, вы можете распараллелить записи, например,

for i in {1..10000}; do
  for j in {1..100}; do
    gsutil cp gs://BUCKET_NAME/FILENAME.csv "gs://BUCKET_NAME/FILENAME_${i}_${j}.csv" &
  done
  wait
done

Вы могли бы сделать это еще быстрее, если бы вы переключились на (скажем) Python и внедрили, используя очередь задач, так что вы сохраняете 100 рабочих непрерывно занятыми вместо того, чтобы порождать 100 потоков и позволять им каждый заканчивать работу перед порождением следующего пакета (как реализация bash выше).

0 голосов
/ 05 июня 2019

Я напишу программу nodejs и извлеку выгоду из ее асинхронности. Тем не менее, он потребляет много ресурсов процессора, поэтому вам может потребоваться сделать несколько пакетов.

const fs = require('fs');
const x = 1000000;
for (let i = 0; i < x; i++) {
    fs.createReadStream('./filename.csv').pipe(fs.createWriteStream('./filename'+i+'.csv'));
}
...