我正在尝试编写一个 lambda 函数,该函数可以将一个巨大的 csv 文件流转换为多个小的 json 文件(比如 2000 行的 json 文件),从一个 s3 存储桶到一个 s3 存储桶。我虽然有一些限制,比如在 256 MB 的有限 RAM 内存中运行。
我可以通过将文件作为文件而不是像下面的流来做同样的事情。
但是由于内存限制,我需要在流中处理这个。有没有办法使用流做同样的事情?
// transformationClass.js
const csv = require('csvtojson');
const extension = '.json';
class S3CsvToJson {
static async perform(input, output, headers) {
let jsonArray = null;
const s3Object = await s3.getObject(); // getting the s3 object
const csvString = s3Object.Body.toString('utf8');
await csv({
noheader: false,
})
.fromString(csvString)
.then((csvRow) => {
jsonArray = csvRow;
});
const fileNames = await S3CsvToJson.writeToFile(jsonArray, output);
return { files: fileNames };
}
static async writeToFile(jsonArray, output) {
const minNumber = 0;
const maxNumber = 1999;
const fileNames = [];
let outFile;
if (jsonArray && Array.isArray(jsonArray)) {
let fileIterator = 1;
while (jsonArray.length) {
outFile = `${output.key}-${fileIterator}${extension}`;
await // s3.putObject(). writing to s3
.putObject(
outFile,
output.bucketName,
JSON.stringify(jsonArray.splice(minNumber, maxNumber)),
);
console.log('rows left :', jsonArray.length);
fileNames.push(outFile);
fileIterator += 1;
}
}
return fileNames;
}
}
module.exports = S3CsvToJson;
这是处理函数
// handler.js
module.exports.perform = async (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
await s3CsvToJson.perform(event.input, event.output, event.headerMapping)
.then((result) => callback(null, result));
console.log('leaving - ', Date.now());
};
提前致谢!!