node.js - Cloud Function 运行缓慢并超出可用内存
问题描述
我正在使用 Cloud Functions 在 BigQuery 中的分区表中运行查询。该表的大小为 1GB。
该脚本会提取与 id 匹配的所有数据并将每个数据流式传输到 Google Cloud Storage 存储桶中。它对表中的所有 id 执行此操作(大约 100 次)。该脚本正在运行,但是它运行缓慢,并且在 Cloud Function 内存不足之前仅拉出 9 个商家。在构建菜单中增加内存没有任何效果。
有没有办法加快这个操作并减少它每次使用的内存量?
const { BigQuery } = require("@google-cloud/bigquery");
const { Storage } = require("@google-cloud/storage");
const bucketName = "xxxx";
const stream = require("stream");
const { parse, Parser } = require("json2csv");
const bigquery = new BigQuery();
const storage = new Storage();
const fields = [
"id",
"product_name",
"product_desc",
"etc"
];
exports.importBQToGCS = (req, res) => {
"use strict";
const liveMerchantCount = 113;
(async function () {
try {
for (let i = 1; i < liveMerchantCount; i += 1) {
const query =
`SELECT *
FROM \`table_name\`
WHERE id_number = ` + i;
const options = {
query: query,
location: "EU",
};
const [job] = await bigquery.createQueryJob(options);
console.log(`Job ${job.id} started.`);
const createFile = storage.bucket(bucketName).file(`test_${i}.csv`);
const [rows] = await job.getQueryResults();
const csv = parse(rows, { fields });
const dataStream = new stream.PassThrough();
dataStream.push(csv);
dataStream.push(null);
await new Promise((resolve, reject) => {
console.log("Writing to GCS");
dataStream
.pipe(
createFile.createWriteStream({
resumable: false,
validation: false,
metadata: { "Cache-Control": "public, max-age=31536000" },
})
)
.on("error", (error) => {
console.error("Stream failed", error);
reject(error);
})
.on("finish", () => {
resolve(true);
});
});
}
res.status(200).send();
} catch (err) {
res.send(err);
}
})();
};
解决方案
在进一步测试中,问题似乎是 BigQuery 正在为一个正在为此功能清除内存的商家返回一个特别大的 JSON 文件 (250MB)。所有其他的都低于 100MB。一旦我排除了这个特定的查询,该函数就会按预期工作。
推荐阅读
- java - spark.sql.columnNameOfCorruptRecord 的默认值是多少?
- powershell - 命令顺序错误,日历总是显示倒数第二个日期(Powershell)
- caching - 微服务、缓存和负载平衡设计模式
- sql - SQL 触发器假更新
- amazon-web-services - 在无服务器架构/Lambda 上运行 Kafka Producer/Listener 的方法
- node.js - Azure AD 回调 URL 不是每次都被命中
- powerbi - 问:Power BI for Azure Log Analytics/Monitor in Multi-Tenancy Scenario
- sql - 如何用group by查询group by?
- r - 跨组选择最大值 - R/Dplyr 解决方案
- c++ - 包含 C++ INCLUDE 定义的 LUA 文件如何解析和修改?