2016-07-28 9 views
7

Ich brauche eine Zip-Datei zu erstellen, die aus einer Auswahl besteht aus Dateien (Videos und Bildern), die in meinem s3 Eimer.eine Zip-Datei auf S3 von Dateien auf S3 mit Lambda Knoten

Das Problem im Moment unter meinem Code ist, dass ich schnell das Speicherlimit auf Lambda getroffen.

async.eachLimit(files, 10, function(file, next) { 
    var params = { 
     Bucket: bucket, // bucket name 
     Key: file.key 
    }; 
    s3.getObject(params, function(err, data) { 
     if (err) { 
      console.log('file', file.key); 
      console.log('get image files err',err, err.stack); // an error occurred 
     } else { 
      console.log('file', file.key); 
      zip.file(file.key, data.Body); 
      next(); 
     } 
    }); 
}, 
function(err) { 
    if (err) { 
     console.log('err', err); 
    } else { 
     console.log('zip', zip); 
     content = zip.generateNodeStream({ 
      type: 'nodebuffer', 
      streamFiles:true 
     }); 
     var params = { 
      Bucket: bucket, // name of dest bucket 
      Key: 'zipped/images.zip', 
      Body: content 
     }; 
     s3.upload(params, function(err, data) { 
      if (err) { 
       console.log('upload zip to s3 err',err, err.stack); // an error occurred 
      } else { 
       console.log(data); // successful response 
      } 
     }); 
    } 
}); 
  • Ist dies möglich, Lambda, oder sollte ich an einem anderen Ansatz aussehen?

  • Ist es möglich, in eine komprimierte ZIP-Datei im laufenden Betrieb zu schreiben, wodurch das Speicherproblem etwas beseitigt wird, oder müssen die Dateien vor der Komprimierung gesammelt werden?

Jede Hilfe wäre sehr willkommen.

Antwort

1

mit Hilfe von Streams kann schwierig sein, da ich nicht sicher bin, wie Sie könnten Rohr mehrere Streams in ein Objekt. Ich habe das mehrmals mit dem Standard-Dateiobjekt gemacht. Es ist ein mehrstufiger Prozess und es ist ziemlich schnell. Denken Sie daran, dass Lambda unter Linux arbeitet, so dass Sie alle Linux-Ressourcen zur Hand haben, einschließlich des Verzeichnisses system/tmp.

  1. Erstellen Sie ein Unterverzeichnis in/tmp Anruf "transient" oder was auch immer für Sie arbeitet
  2. Verwenden s3.getObject() und Dateiobjekte auf/tmp/transient
  3. Verwenden Sie das GLOB Paket schreiben zu erzeugen ein Array [] von Pfaden von/tmp/transient
  4. Schleife des Array und zip.addLocalFile (array [i]);
  5. zip.writeZip ('tmp/files.zip');
+0

Das einzige Problem, das ich mit diesem sehen kann, ist, dass Lambda zu 500MB Speicher im tmp-Verzeichnis beschränkt ist. In diesem Fall würde es auch die endgültige Zip-Größe begrenzen. – Rabona

+1

Nicht sicher, ob Sie eine Dateiverarbeitung neben dem ZIP-Prozess ausführen, aber mit dieser Datenmenge möchten Sie sicherstellen, dass Ihre Funktion innerhalb des Ausführungszeitraums von 5 Minuten abgeschlossen werden kann. Meine größte Datengröße liegt typischerweise bei 20-25 mg pro Ausführung. –

+0

@Rabona haben Sie es geschafft, dieses Problem über Lambda zu lösen? Ich habe das gleiche Problem. Wir müssen eine 1,5-GB-Videodatei mit etwa 100 MB Bildern zippen. Wir haben keine Speicher mehr. Wir haben auch mit einer kleineren Videodatei (~ 1GB) mit den gleichen Bildern versucht und Timeouts bekommen. In der Hoffnung, dass Sie etwas Nützliches entdeckt haben, das uns auch helfen könnte. – Forer