我正在使用Google Cloud,在其中一个存储桶(GCS)中,我有一个包含子文件夹的文件夹,每个子文件夹都有大约600MB到1.5GB的zip文件。如果我必须给出zip文件的计数,我会说它们大约是2000多个zip文件。
每个zip文件都有不同大小的CSV文件。我必须解压缩每个文件,然后读取csv文件并对它们进行操作。我的问题是我无法解压缩桶本身的文件。
现在,通过shell脚本,我一次将一个子文件夹复制到我当前的工作目录,解压缩然后写回GCS中的存储桶并删除旧的解压缩数据,依此类推。
我一次只做一个子文件夹,因为如果我尝试将所有内容复制到一个go中,我当前的工作目录就会用完空间。每当我获得新数据并且频繁获取新数据时,我将需要执行上述活动。是否有更好的方法或更智能的方法解压缩Bucket(GCS)本身的文件?
答案 0 :(得分:1)
我在GCP博客上找到了一个帖子,可以作为解决方案。我测试了一个类似的问题,并且效果很好。
https://medium.com/google-cloud/google-cloud-storage-exploder-221c5b4d219c
该解决方案使用Google Cloud Functions作为GCS触发器,将zip文件上传到GCS后使其“爆炸”。
代码是:
/* 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();
});
}
}));
}
答案 1 :(得分:0)
GCS服务中没有解压缩文件的机制,因为GCS上传一次只能创建一个对象。
我不确定您对当前工作目录有什么限制,但另一种方法是上传zip文件,然后将它们下载到连接到Google Compute Engine实例的永久磁盘上,解压缩它们在那里,使用gsutil
上传解压缩的文件。您应该能够创建一个可以容纳所有解压缩内容的大型永久磁盘。