将createwritestream与xmlbuilder一起使用会消耗大量ram

oyjwcjzk  于 2021-09-23  发布在  Java
关注(0)|答案(0)|浏览(175)

我们需要创建一个包含一些项目的xml文件,因此我们使用xmlbuilder模块来实现这一点。
阵列有50k的产品,处理文件的内存使用量为200mb的ram,但在使用xmlbuilder创建文件时,内存使用量会超过1gb的ram,现在我们可以处理,但服务器在某些时候会耗尽内存。
这是我正在使用的函数,我需要找到一种方法,在不消耗大量ram的情况下处理文件。生成文件的时间不是问题,我们可以等待,但ram的使用是一个大问题。

const fs = require("fs");

const products = [...new Array(50000)].map((item, i) => ({
  _id: i,
  name: "productName",
  description: "productDescription",
  currency: "USD",
  salePrice: 100,
  img: ["https://productLink.com"],
  productAvailability: true,
  slug: "product-slug",
}));

let items = [];

for await (const product of products) {
  const item = {
    id: product._id,
    title: product.name,
    description: product.description,
    image: product.img[0],
    availability: product.productAvailability ? "in stock" : "out of stock",
    price: `${product.salePrice} ${product.currency}`,
  };

  items = [...items, item];
}

let obj = {
  rss: {
    channel: {
      item: items,
    },
  },
};

const root = xmlbuilder.create(obj, { encoding: "utf-8" });
const writeStream = fs.createWriteStream("file.xml");
const writer = xmlbuilder.streamWriter(writeStream);
const xml = root.end(writer);

(obj = {}), (items = []), (xmldoc = ""), (products = []); // Declare all to empty to reduce node cache

writeStream.end();
writeStream
  .on("error", (error) => {
    throw error;
  })

  .on("finish", async () => {
    console.log("done");
  });

如果有任何关于如何创建此文件的想法,将很好,谢谢

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题