Google云端存储-快速创建单个对象/文件的多个副本

时间:2019-06-05 03:10:49

标签: bash google-cloud-platform google-cloud-storage

我想为一个文件制作一百万份副本。现在,我正在遍历并一次创建一个副本,每个文件大约需要一秒钟(使用bash)。有没有更好/更快的方法可以做到这一点?

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

3 个答案:

答案 0 :(得分:2)

您可以使用parallel命令来更快地完成此操作。例如,这将创建100万个对象,一次只能运行100个gsutil实例:

seq 1000000 | parallel --jobs 100 gsutil cp gs://BUCKET_NAME/FILENAME.csv \
    "gs://BUCKET_NAME/FILENAME_{}.csv"

答案 1 :(得分:1)

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实现确实如此)。

答案 2 :(得分:-2)

我将编写一个nodejs程序并利用其异步进行。不过,这会占用很多CPU时间,因此您可能需要做一些批处理。

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