我的公司正在将大型存档文件上传到S3,现在希望它们在S3上解压缩.我写了一个基于解压缩的lambda函数,由一个文件到达xxx-zip存储桶触发,它从S3流式传输zip文件,解压缩流,然后将各个文件流式传输到xxx-data存储桶.
它可以工作,但我发现它比我预期的要慢得多 - 即使在测试文件,zip大小约为500k并且保存大约500个文件,这是超时设置60秒的超时.这看起来是对的吗?在使用节点运行的本地系统上,它比这更快.在我看来,由于文件正在亚马逊的云中移动,因此延迟应该很短,并且由于文件正在流式传输,因此实际花费的时间应该是解压缩流所花费的时间.
有没有一个固有的原因,为什么这不起作用,或者我的代码中有什么东西导致它这么慢?这是我第一次使用node.js,所以我可能会做得很糟糕.或者,有没有更好的方法来做到谷歌找不到的?
这是代码的大纲(BufferStream是我编写的一个类,它将返回的Buffer包装s3.getObject()成一个readStream)
var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: '2006-03-01'});
var unzip = require('unzip');
var stream = require('stream');
var util = require( "util" );
var fs = require('fs');
exports.handler = function(event, context) {
var zipfile = event.Records[0].s3.object.key;
s3.getObject({Bucket:SOURCE_BUCKET, Key:zipfile},
function(err, data) {
var errors = 0;
var total = 0;
var successful = 0;
var active = 0;
if (err) {
console.log('error: ' + err);
}
else { …Run Code Online (Sandbox Code Playgroud) 我有一个相册,当用户单击“前进”或“后退”时,它会循环显示一系列图像,这是通过设置 img 的 src 的 Javascript 实现的。它可以在 FF、Opera、IE 和 Safari 上正常运行,但不能在 Chrome 中运行 - 在 Chrome 中,图像有时会出现,有时是空白。如果图像被缓存,它们似乎是可见的,但如果它们尚未加载,Chrome 就不会加载它们。我已经确认元素中的 src 设置正确,只是没有显示。
如果图像加载到页面的 html 中,那么当在 javascript 中设置 .src 时,它们会正确显示,但如果它们不在加载的 html 代码中,那么其中一些会显示,有些则不会 - 但仅限于 Chrome,在所有其他浏览器中它似乎工作正常。
Chrome 是否需要使用一些缓存设置,或者我可以进行一些修改来确保这些设置正确加载?
谢谢大家。
罗素
(已添加)下面是一些代码。它已生成,这就是奇怪常量的来源,并且文件继续包含数百个 < li > 元素
<HTML>
<HEAD>
<link href="../lame.css" rel="stylesheet" type="text/css">
<TITLE>Young/Haraske slides</TITLE>
<script src="../lame.js"></script>
<script>
var int2atts = [], int2path = [], paths = {}, atts;
atts = {}
int2atts[36] = atts;
int2path[36] = "Families/Young/Russell"
window.onload = function() {substituteNodeInfo(); showPage(254);}
var imagePtr = …Run Code Online (Sandbox Code Playgroud) (下面的新信息)我正在尝试设置一个lambda函数,通过解压缩并将结果写回S3,对上传的tgz文件作出反应.解压缩和解压缩工作正常,但上传到S3失败:
/Users/russell/lambda/gzip/node_modules/aws-sdk/lib/s3/managed_upload.js:350
var buf = self.body.read(self.partSize - self.partBuffer.length) ||
^
TypeError: undefined is not a function
at ManagedUpload.fillStream (/Users/russell/lambda/gzip/node_modules/aws-sdk/lib/s3/managed_upload.js:350:25)
at Entry.<anonymous> (/Users/russell/lambda/gzip/node_modules/aws-sdk/lib/s3/managed_upload.js:167:28)
at Entry.emit (events.js:104:17)
at Entry._read (/Users/russell/lambda/gzip/node_modules/tar/lib/entry.js:123:12)
at Entry.end (/Users/russell/lambda/gzip/node_modules/tar/lib/entry.js:82:8)
at Parse._process (/Users/russell/lambda/gzip/node_modules/tar/lib/parse.js:107:13)
at BlockStream.<anonymous> (/Users/russell/lambda/gzip/node_modules/tar/lib/parse.js:47:8)
at BlockStream.emit (events.js:107:17)
at BlockStream._emitChunk (/Users/russell/lambda/gzip/node_modules/tar/node_modules/block-stream/block-stream.js:145:10)
at BlockStream.write (/Users/russell/lambda/gzip/node_modules/tar/node_modules/block-stream/block-stream.js:45:10)
Run Code Online (Sandbox Code Playgroud)
当我写入S3时会发生此错误,但如果我将文件本地写入磁盘则可以正常工作,因此管道是正确的.
以下是演示此问题的代码:
var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: '2006-03-01'});
var zlib = require('zlib');
var tar = require('tar');
var fstream = require('fstream');
fstream.Reader({'path': 'testdata.tar.gz'})
.pipe(zlib.Unzip())
.pipe(tar.Parse())
.on('entry', function(entry) {
var filename = …Run Code Online (Sandbox Code Playgroud) 我无法弄清楚是什么导致了这个引用错误:
error[E0515]: cannot return value referencing local variable `s1`
--> src/regexp/mod.rs:538:9
|
528 | match s1.step() {
| --------- `s1` is borrowed here
...
538 | steps
| ^^^^^ returns a value referencing data owned by the current function
For more information about this error, try `rustc --explain E0515`.
error: could not compile `regexp` due to previous error
Run Code Online (Sandbox Code Playgroud)
我已经创建了 CharsStep 结构克隆和复制,并且在两次推送中我都尝试推送对象的克隆并进行分配以获取副本并推送它。我以为我开始理解内存模型了,但这个模型让我陷入困境。这里借的是什么?在添加到步骤向量之前,是否所有引用都已复制(多次!)?
我查看了建议的参考,它只是解释了我所知道的,即我只能返回值,而不是对本地值的引用,但由于它们是克隆的,所以我认为它们没问题。
pub trait Walker {}
// used to hold the state at each step in the search walk, and …Run Code Online (Sandbox Code Playgroud) Clippy 发出以下警告:
warning: very complex type used. Consider factoring parts into `type` definitions
--> src/regexp/mod.rs:845:56
|
845 | pub fn get_by_name<'b>(&'b self, name: &'b str) -> Vec<(&'b String, (usize, usize), (usize, usize))> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#type_complexity
= note: `#[warn(clippy::type_complexity)]` on by default
Run Code Online (Sandbox Code Playgroud)
我同意这个警告。当我输入这段代码时,我不喜欢它,但我似乎不知道在哪里以及如何放置该type语句。我查过这本书,按照 Clippy 给出的参考链接进行搜索,似乎无法找到有关使用来type简化函数签名或如何处理参数生命周期的参考String。定义一个新的结构来保存返回值是可行的,但除了简化函数定义之外,实际上没有任何理由需要这样的结构。
这是代码。您可以看到我通过使用现有的 Report 结构来修复它 - 它有一些额外的字段不在我的返回设计中,但该结构已经存在,并且实际上使额外的字段可用可能会更好。但谢谢你的回答,我应该知道这里是否使用它。
pub struct Report {
/// The string found matching the RE pattern
pub found: String,
/// The …Run Code Online (Sandbox Code Playgroud) amazon-s3 ×2
node.js ×2
rust ×2
aws-lambda ×1
aws-sdk ×1
caching ×1
image ×1
javascript ×1
lifetime ×1
rust-clippy ×1
tar ×1
types ×1