在AWS S3文件中是否有快速访问线路的方法?

时间:2012-10-02 19:16:28

标签: amazon-s3 line boto

我在S3上存储的文件中有一组JSON消息(每行一条消息)。每条消息都有一个唯一的密钥作为消息的一部分。我还有一个简单的DynamoDB表,其中此键用作主键。该表包含相应JSON消息所在的S3文件的名称。

我的目标是从给定密钥的文件中提取JSON消息。当然,最糟糕的情况是消息是文件中的最后一行。

使用boto库从文件中提取邮件的最快方法是什么?特别是,是否有可能以某种方式直接读取文件?当然,我可以使用boto.s3.key.get_file()将整个内容读取到本地文件,然后打开文件并逐行读取并检查要匹配的ID。但是有更有效的方法吗?

非常感谢!

3 个答案:

答案 0 :(得分:2)

S3无法做到这一点。也就是说,您还有其他选择:

  1. 存储记录的长度和位置(字节偏移量),而不是DynamoDB中的行号。这将允许您使用the Range: header
  2. 检索该记录
  3. 使用缓存层存储{ S3 object key, line number } => { position, length }元组。如果要按{ S3 object key, line number }查找记录,请引用缓存。如果您还没有这些数据,则必须像现在一样获取整个文件 - 但是在获取文件后,您可以计算其中每一行的偏移量,并节省自己的工作量。
  4. 直接在DynamoDB中存储JSON记录。考虑到64 KB的项目限制,这可能是也可能不实用。
  5. 分别在S3中存储每个JSON记录。然后,您可以消除DynamoDB密钥查找,并直接转到S3以获取给定记录。
  6. 哪种方式最适合您取决于您​​的应用程序体系结构,访问此数据的方式,并发问题(鉴于您当前的解决方案可能并不重要),以及您对延迟和成本的敏感性。

答案 1 :(得分:0)

你可以使用带有流的内置readline:

const readline = require('readline');
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const params = {Bucket: 'yourbucket', Key: 'somefile.txt'};
const readStream = s3.getObject(params).createReadStream();
const lineReader = readline.createInterface({
  input: readStream,
});
lineReader.on('line', (line) => console.log(line));

答案 2 :(得分:0)

您可以使用 S3 SELECT 来完成此操作。也适用于镶木地板文件。

https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-glacier-select-sql-reference-select.html