Google cloud storage 直接在Google Cloud Bucket中解压缩文件
我正在使用谷歌云,在其中一个bucket(GCS)中,我有一个文件夹,其中有子文件夹,每个子文件夹都有大约600MB到1.5GB的zip文件。如果我必须给出zip文件的数量,我会说它们大约是2000多个zip文件 每个zip文件都有不同大小的CSV文件。我必须解压缩每个文件,然后读取csv文件并对其进行操作。我的问题是我无法解压bucket中的文件 现在,通过一个shell脚本,我一次复制一个子文件夹到我当前的工作目录,解压缩它,然后写回GCS中的bucket,删除旧的解压缩数据等等Google cloud storage 直接在Google Cloud Bucket中解压缩文件,google-cloud-storage,Google Cloud Storage,我正在使用谷歌云,在其中一个bucket(GCS)中,我有一个文件夹,其中有子文件夹,每个子文件夹都有大约600MB到1.5GB的zip文件。如果我必须给出zip文件的数量,我会说它们大约是2000多个zip文件 每个zip文件都有不同大小的CSV文件。我必须解压缩每个文件,然后读取csv文件并对其进行操作。我的问题是我无法解压bucket中的文件 现在,通过一个shell脚本,我一次复制一个子文件夹到我当前的工作目录,解压缩它,然后写回GCS中的bucket,删除旧的解压缩数据等等 我一次只复
我一次只复制一个子文件夹,因为如果我尝试一次复制所有内容,我当前的工作目录空间就会耗尽。每当我获得新数据时,我都需要进行上述活动,而且获取新数据将是频繁的。有没有更好或更智能的方法来解压Bucket(GCS)本身中的文件?GCS服务中没有解压文件的机制,因为GCS上载一次只创建一个对象
我不确定您当前的工作目录有什么限制,但另一种方法是上载zip文件,然后将它们下载到连接到Google Compute Engine实例的持久磁盘上,在那里解压缩,然后使用
gsutil
上载解压缩的文件。您应该能够创建一个大的持久磁盘,可以保存所有解压缩的内容。我在GCP博客上找到一篇文章,可以作为解决方案。我测试了我遇到的一个类似的问题,效果非常好
该解决方案使用谷歌云功能作为GCS触发器,在文件上传到GCS后对zip文件进行“分解”
代码是:
/* globals exports, require */
//jshint strict: false
//jshint esversion: 6
'use strict';
const crc32 = require("fast-crc32c");
const gcs = require('@google-cloud/storage')();
const stream = require("stream");
const unzipper = require("unzipper");
const bucketName = {
src: "[[REPLACE: ${ROOT}-receive]]",
dst: "[[REPLACE: ${ROOT}-explode]]"
};
exports.processZip = function(event) {
const file = event.data;
console.log(`Processing Zip: ${file.name}`);
var srcBucket = gcs.bucket(bucketName.src);
var dstBucket = gcs.bucket(bucketName.dst);
var gcsSrcObject = srcBucket.file(file.name);
var prefix = (new Date()).getTime();
gcsSrcObject.createReadStream()
.pipe(unzipper.Parse())
.pipe(stream.Transform({
objectMode: true,
transform: function(entry, e, cb) {
var filePath = entry.path;
var type = entry.type;
var size = entry.size;
console.log(`Found ${type}: ${filePath}`);
var gcsDstObject = dstBucket.file(`${prefix}/${filePath}`);
entry
.pipe(gcsDstObject.createWriteStream())
.on('error', function(err) {
console.log(`Error: ${err}`);
})
.on('finish', function() {
console.log('Complete');
cb();
});
}
}));
}
对不起,我发布这个链接是为了给写这篇博文的人加学分。但我会编辑答案以满足要求