【发布时间】:2016-03-09 23:05:31
【问题描述】:
我正在对 JSON 响应进行一些处理,并希望将结果数据上传到 cloudsearch。我可以一次完成一份文件:
const AWS = require("aws-sdk");
const JSONStream = require("JSONStream");
const jsonStream = JSONStream.parse("*");
const csd = AWS.CloudSearchDomain(config);
jsonStream.on("data", processData);
request.get(resultUrl).pipe(jsonStream);
function processData(data) {
data = doProcessData(data);
/*
* `data` is now a JSON object ready to be uploaded to CloudSearch
* e.g. {type: "add", id: "random-id", fields: {field: "a"}}
*/
csd.uploadDocuments({contentType: "application/json", documents: [data]});
}
这可行,但AWS suggests:
为了获得最佳的上传性能,请将接近最大批量大小的批量添加和删除操作分组
我在想我可以将文档写入文件并检查文件大小并在文件大约为 3MB 时上传文档。我可以接近 5MB,但我不想超过批量大小:
/* Please ignore semantic errors */
filename = "/tmp/foo.json";
file = fs.createWriteStream(filename);
file.write("[");
// in `processData`
file.write(JSON.stringify(data));
const stats = file.stat(filename);
if (stats.size > 3000000) {
file.write("]");
csd.uploadDocuments({documents: fs.createReadStream(filename)});
fs.trunate(filename);
}
else {
file.write(",");
}
这种方法没问题,但如果有更好的方法来确定文件是否已准备好上传,那就太好了。如果可以的话,我也希望避免使用文件系统。
我也可以通过以下方式在内存中执行此操作:
const stringifier = JSONStream.stringify("[", ",", "]");
// in `processData`
csd.uploadDocuments({documents: stringifier});
stringifier.write(data);
但是,批处理大小可能会超过 5MB。我也不确定如何检查已写入 JSON 流的内容。
有没有将派生文档写入 CloudSearch 的好方法?如果做不到这一点,是否有一种简单的方法可以检查已将多少空间写入流,甚至变量正在使用多少空间?
【问题讨论】:
标签: javascript node.js amazon-web-services stream amazon-cloudsearch