直接在Google Cloud Bucket中解压缩文件

时间:2017-12-27 09:50:50

标签: google-cloud-storage

我正在使用Google Cloud,在其中一个存储桶(GCS)中,我有一个包含子文件夹的文件夹,每个子文件夹都有大约600MB到1.5GB的zip文件。如果我必须给出zip文件的计数,我会说它们大约是2000多个zip文件。

每个zip文件都有不同大小的CSV文件。我必须解压缩每个文件,然后读取csv文件并对它们进行操作。我的问题是我无法解压缩桶本身的文件。

现在,通过shell脚本,我一次将一个子文件夹复制到我当前的工作目录,解压缩然后写回GCS中的存储桶并删除旧的解压缩数据,依此类推。

我一次只做一个子文件夹,因为如果我尝试将所有内容复制到一个go中,我当前的工作目录就会用完空间。每当我获得新数据并且频繁获取新数据时,我将需要执行上述活动。是否有更好的方法或更智能的方法解压缩Bucket(GCS)本身的文件?

2 个答案:

答案 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上传解压缩的文件。您应该能够创建一个可以容纳所有解压缩内容的大型永久磁盘。