【问题标题】:How can I fix a memory problem in node.js?如何解决 node.js 中的内存问题?
【发布时间】:2019-10-30 21:41:10
【问题描述】:

我收到以下错误。 我检查了一下,似乎是因为服务器内存不足,json文件太大而无法运行。

我们如何解决这个问题? 有一个东西叫 Node streaming,我很难理解。能不能简单点解释一下?

server.js

const express = require('express');
const cors = require('cors');
const userJson = require('./user');
const locationJson = require('./location');

const API_PORT = process.env.PORT || 3002;
const app = express();
app.use(cors());
const router = express.Router();

router.get("/getUserData", (req, res) => {
    return res.json(userJson);
});

router.get("/getLocationData", (req, res) => {
    return res.json(locationJson);
});

app.use("/api", router);

app.listen(API_PORT, () => console.log(`LISTENING ON PORT ${API_PORT}`));

错误消息

buffer.js:585
      if (encoding === 'utf8') return buf.utf8Slice(start, end);
                                          ^

Error: Cannot create a string longer than 0x3fffffe7 characters
    at stringSlice (buffer.js:585:43)
    at Buffer.toString (buffer.js:655:10)
    at Object.readFileSync (fs.js:392:41)
    at Object.Module._extensions..json (internal/modules/cjs/loader.js:816:22)
    at Module.load (internal/modules/cjs/loader.js:666:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:606:12)
    at Function.Module._load (internal/modules/cjs/loader.js:598:3)
    at Module.require (internal/modules/cjs/loader.js:705:19)
    at require (internal/modules/cjs/helpers.js:14:16)
    at Object.<anonymous> (/Users/k/Desktop/dev/backend/location.js:1:22)

【问题讨论】:

  • Streams 似乎是您唯一的选择。你有什么不明白 ?该文档有很多示例。基本上,您创建一个流,然后将其通过管道传输到您想要的任何处理函数。该函数将分块接收数据。
  • 使用流和拆分数据的意思一样吗?例如,它是否比人为分配 10 个内存单元更有效?使用流比分配额外内存更快?
  • 我不知道 Node 中的内存管理是如何工作的,但是你可以看看这个问题:stackoverflow.com/questions/42896447/…
  • require('./user')require('./location') 是您的问题线(假设它们确实太大了)。您需要创建一个Readable Stream,而不仅仅是require,并且只有在加载数据后,才能实例化您的快速路线。 EDIT 看起来还有一个 npm 模块 JSONStream 在这里可能会有所帮助。
  • Selblor & romellem 非常感谢 :)

标签: node.js json express


【解决方案1】:

您可以将文件和 pipe() 直接流式传输到 res 中:

const fs = require('fs');
const path = require('path');

const getBigJson = (req, res, next) => {
    const pathToJson = path.join(__dirname, 'path/to/file');
    const jsonStream = fs.createReadStream(pathToJson);
    res.set({'Content-Type': 'application/json'});
    jsonStream.pipe(res);
};

它应该一块块地发送它而不会耗尽你的内存。

请参阅https://github.com/substack/stream-handbook 了解有关流的详细说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多