Node.js 在azure函数中处理1GB大小的管道分隔文本文件的最佳方法

Node.js 在azure函数中处理1GB大小的管道分隔文本文件的最佳方法,node.js,azure-functions,Node.js,Azure Functions,我在blob存储中有一个1GB的文本文件,目前我正在构建一个函数,该函数将获取每行的内容并将其发送到外部API。这个外部API限制为每秒200个请求,由于订阅计划的原因,我的函数运行时间也限制为10分钟 我正在研究使用持久函数来处理这个用例,方法是将文件分块读取。我编写了以下代码来测试如何将代码读入chucks module.exports = async function (context, myTimer) { context.log("Trigger fired"

我在blob存储中有一个1GB的文本文件,目前我正在构建一个函数,该函数将获取每行的内容并将其发送到外部API。这个外部API限制为每秒200个请求,由于订阅计划的原因,我的函数运行时间也限制为10分钟

我正在研究使用持久函数来处理这个用例,方法是将文件分块读取。我编写了以下代码来测试如何将代码读入chucks

module.exports = async function (context, myTimer) {
    context.log("Trigger fired");
    
    if (myTimer.isPastDue)
    {
        context.log('JavaScript is running late!');
    }

    const containerClient = getContainerClient(process.env.AzureWebJobsStorage, 'location');
    for await (const blob of containerClient.listBlobsFlat()) {
        if(blob.name !== 'test.txt') {
            continue
        }

        const blobClient = containerClient.getBlobClient(blob.name);
        const downloadBlockBlobResponse = await blobClient.download(0, (1024 * 1024));
        try{
            const blobContent = (
              await streamToBuffer(downloadBlockBlobResponse.readableStreamBody)
            ).toString();
            context.log(blobContent);
        }
        catch (error) {
            context.log(`ERROR: issues reading the following file - ${blob.name}, due to the following error : ${error.message}`);
        } 
    }
    context.log("Trigger completed");
};

async function streamToBuffer(readableStream) {
  return new Promise((resolve, reject) => {
    const chunks = [];
    readableStream.on("data", (data) => {
      chunks.push(data instanceof Buffer ? data : Buffer.from(data));
    });
    readableStream.on("end", () => {
      resolve(Buffer.concat(chunks));
    });
    readableStream.on("error", reject);
  });
}

但是,当我读一个MB的文本文件时,块结束在一行的中间而不是在结尾,这意味着我不能把最后一行发送到API。 有人知道我如何保证数据块始终包含完整的行吗?或者有更好的方法在Azure中处理这个用例吗

该文件的内容如下所示


测试|测试二|test@test.com|美国|纽约| 1234 | main | street | 12347 | 711 | 1973-09-09

除非您事先知道每行的行长(比如每行正好有128字节长或类似的长度),否则无法始终读取到完美的行边界

取而代之的是,你必须连续不断地读少量的内容,直到你读到一行的末尾,然后在你的临时存储器中标记下一行继续读的位置,以开始读下一行

例如,如果一个典型的行是100字节长的,并且您以一个部分行结束(您几乎总是这样),那么再读取250字节左右,直到找到当前所在行的结尾。然后,计算该行结束时的文件位置,并将其存储到下一个过程中