我在S3上存储的文件中有一组JSON消息(每行一条消息)。每条消息都有一个唯一的密钥作为消息的一部分。我还有一个简单的DynamoDB表,其中此键用作主键。该表包含相应JSON消息所在的S3文件的名称。
我的目标是从给定密钥的文件中提取JSON消息。当然,最糟糕的情况是消息是文件中的最后一行。
使用boto
库从文件中提取邮件的最快方法是什么?特别是,是否有可能以某种方式直接读取文件?当然,我可以使用boto.s3.key.get_file()
将整个内容读取到本地文件,然后打开文件并逐行读取并检查要匹配的ID。但是有更有效的方法吗?
非常感谢!
答案 0 :(得分:2)
S3无法做到这一点。也就是说,您还有其他选择:
Range:
header。{ S3 object key, line number } => { position, length }
元组。如果要按{ S3 object key, line number }
查找记录,请引用缓存。如果您还没有这些数据,则必须像现在一样获取整个文件 - 但是在获取文件后,您可以计算其中每一行的偏移量,并节省自己的工作量。哪种方式最适合您取决于您的应用程序体系结构,访问此数据的方式,并发问题(鉴于您当前的解决方案可能并不重要),以及您对延迟和成本的敏感性。
答案 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