首页 > 解决方案 > 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);
    }
  })();
};

标签: node.jsgoogle-cloud-platformgoogle-bigquerygoogle-cloud-storage

解决方案


在进一步测试中,问题似乎是 BigQuery 正在为一个正在为此功能清除内存的商家返回一个特别大的 JSON 文件 (250MB)。所有其他的都低于 100MB。一旦我排除了这个特定的查询,该函数就会按预期工作。


推荐阅读