Node.js 如何从S3读取CSV流,但从文件中间的某处开始?

Node.js 如何从S3读取CSV流,但从文件中间的某处开始?,node.js,amazon-s3,lambda,aws-lambda,amazon-dynamodb,Node.js,Amazon S3,Lambda,Aws Lambda,Amazon Dynamodb,正如标题所述,我的问题主要涉及从AWS S3读取CSV数据。我将提供我正在使用的其他技术的详细信息,但它们对核心问题并不重要 上下文(不是核心问题,只是一些额外的细节) 我有一个用例,需要在AWS Lambda上使用Node.js API处理一些非常大的CSV,并将每个CSV行中的一些数据存储到DynamoDB 我的实现适用于中小型CSV文件。但是,对于大型CSV文件(想想100k-1m行),该过程需要15分钟以上(AWS Lambda函数的最大执行时间) 我真的需要这个实现是无服务器的(因为项

正如标题所述,我的问题主要涉及从AWS S3读取CSV数据。我将提供我正在使用的其他技术的详细信息,但它们对核心问题并不重要

上下文(不是核心问题,只是一些额外的细节) 我有一个用例,需要在AWS Lambda上使用Node.js API处理一些非常大的CSV,并将每个CSV行中的一些数据存储到DynamoDB

我的实现适用于中小型CSV文件。但是,对于大型CSV文件(想想100k-1m行),该过程需要15分钟以上(AWS Lambda函数的最大执行时间)

我真的需要这个实现是无服务器的(因为项目的其余部分是无服务器的,因为缺乏可预测的使用模式等等)

因此,我决定尝试处理文件的开头14.5分钟左右,然后将一个新的Lambda函数排入队列,从上一个函数停止的地方开始处理

我可以很容易地将最后一个函数的行号传递给新函数,这样新的Lambda函数就知道从哪里开始了

因此,如果第一个函数处理了第1-15000行,那么第二个函数将在第15001行拾取处理作业并从那里继续。那部分很简单

<>但是我不能理解如何从中间开始S3的读流。无论我如何设置读取流,它总是从文件的开头开始数据流

不可能将处理任务分成更小的部分(比如为每一行排队等待新的lambda),因为我已经这样做了,并将流程优化为尽可能最小

即使第二个作业从文件的开头开始读取,并且我将其设置为跳过已处理的行,也需要很长时间才能到达文件的结尾

即使我做了一些其他的实现(比如使用EC2而不是Lambda),我仍然会遇到同样的问题。如果第203001行的EC2进程失败怎么办?我需要排队等待下一排的新工作。无论我使用什么技术或什么容器/环境,我仍然需要能够从文件的中间读取

核心问题 所以。。。假设我有一个CSV文件保存到S3。我知道我想从15001行开始读。或者,我想从第689475字节开始读取。或者别的什么

有办法吗?使用AWS SDK for Node.js或任何其他类型的请求


我知道如何在Node.js中设置来自S3的读取流,但我不知道它在后台是如何工作的,因为请求是如何发出的。也许这些知识会有帮助。

啊,这比我做的容易多了。。。以下是Node.js中的答案:

new aws.S3()
    .getObject({
        Key: 'bigA$$File.csv',
        Bucket: 'bucket-o-mine',
        Range: 'bytes=65000-100000',
    })
    .createReadStream()
这是文件:

您可以在任何AWS SDK中或通过HTTP标头执行此操作

以下是AWS对
范围
标题的看法:

下载对象的指定范围字节。有关HTTP范围标头的更多信息,请参阅