我想为一个文件制作一百万份副本。现在,我正在遍历并一次创建一个副本,每个文件大约需要一秒钟(使用bash)。有没有更好/更快的方法可以做到这一点?
for f in {1..1000000}; gsutil cp gs://BUCKET_NAME/FILENAME.csv "gs://BUCKET_NAME/FILENAME_${f}.csv"; done
答案 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'));
}