Google cloud storage 直接在Google Cloud 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)中,我有一个文件夹,其中有子文件夹,每个子文件夹都有大约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();
        });
    }
  }));
}

对不起,我发布这个链接是为了给写这篇博文的人加学分。但我会编辑答案以满足要求