json - 使用 JSON 文件的 Node.js 应用程序会在连接之间共享内存吗?

标签 json node.js memory

我正在尝试决定是在数据库中还是在平面 JSON 文件中保存静态数据(每晚更新,而不是实时更新)来提供 Node.js 应用程序。在初步测试中,平面文件方法的速度是其两倍。我的问题是关于使用file方法时的内存问题。

如果我的 Node.js 应用程序从文件中读取数据,然后执行 JSON.parse 并将对象传递给模板进行渲染...每个用户连接时该数据的内存大小是否会重复?

即如果数据文件为1MB,并发用户数为1000,那么在此期间是否会消耗1000MB的服务器内存?

最佳答案

每个连接单独运行,因此如果您有 1000 个并发用户,他们实际上不会同时运行其请求,因为 Node.js 是单线程的。它运行一个连接,直到它完成或直到它遇到非阻塞操作(例如异步 I/O)。假设您正在使用异步文件 I/O,您可以同时处理多个连接,但一旦一个连接完成,其内存使用量将由垃圾收集器返回给系统。

您的操作听起来非常适合内存缓存。您可以决定什么生命周期最适合缓存,但您可以加载 JSON,将其存储在内存中,设置从现在起 10 分钟后的过期时间,只要当前时间不大于过期时间,您只需返回来自没有磁盘访问的缓存的结果。因此,您最多每 10 分钟才从磁盘检索一次数据,并且数据返回的速度会更快,并且每个请求使用的平均内存会显着降低。

这种缓存方法的唯一缺点是,当数据实时更新时,缓存的数据可能需要长达 10 分钟(平均为缓存时间的 1/2 或 5 分钟)才会过期,新的数据就会过期。要返回的数据。由于这种情况每晚只发生一次,因此对您来说可能不是什么大问题,但如果您愿意,可以通过多种方法来处理该问题。例如,您可以在每次请求时检查数据文件的文件日期/时间,如果自上次以来没有更改,则您只需继续使用数据的缓存版本。当它发生变化时,您可以从磁盘读取它并替换缓存的版本。这会在每个请求上添加额外的磁盘 I/O 操作,但可以保证用户始终获得最新版本,同时仍然可以享受缓存版本的好处,该版本只需在数据实际更改时才需要重新读入内存。

<小时/>

还有一件事需要考虑。如果数据为 1MB,并且您要从中生成一个巨大的 HTML 文件,则您的页面渲染可能是内存消耗最大的地方,因为将大型数据结构扩展为 HTML 通常可以使其增大 10-20 倍,并且渲染引擎的性能如何内存消耗的大小完全取决于渲染引擎。

如果 HTML 中没有针对每个用户的自定义,或者呈现的 HTML 中没有任何其他内容从一个呈现到下一个呈现有所不同(只要 JSON 没有更改),您可能需要实际缓存呈现的 HTML因此您所要做的就是将其流式传输到每个请求。

关于json - 使用 JSON 文件的 Node.js 应用程序会在连接之间共享内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26388912/

相关文章:

javascript - Jquery 两个 api 调用来检索两个嵌套 $.each 循环内的不同动态元素

python - 通过python解析Json数据并更新sql表

javascript - 如何在 JavaScript 中获取 JSON 数据数组?

sql-server - 在 Linux 上使用 Node.js 访问 SQL Server

javascript - JavaScript 内存在浏览器中是如何工作的?

java - 如何在 Android/Java 中用 JSON 数组解析 JSONArray?

javascript - 生产中的 Browserify.js

node.js - 使用 Aleph/Lamina 异步访问 MongoDB

C++ 线程构造函数,使用 new(object) 会造成内存泄漏

C++:std::map的微小内存泄漏