将一个Node.js应用程序消耗JSON文件共享内存之间的连接?

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

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

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

每个连接都是分开运行的,所以如果你有1000个并发用户,他们并不是真的在同一时间运行他们的请求,因为node.js是单线程的。 它运行一个单独的连接,直到它完成,或者直到遇到非阻塞操作,例如asynchronousI / O。 假设您正在使用asynchronous文件I / O,您可以同时处理几个连接,但只要完成一次,它的内存使用就会被垃圾回收器返回给系统。

您的操作对于内存caching听起来非常理想。 你可以决定什么样的生命周期最适合caching,但是你可以加载JSON,把它存储在内存中,从现在起10分钟设置过期时间,只要当前时间不超过过期时间,你只要返回没有磁盘访问的caching结果。 因此,您只能每隔10分钟从磁盘中检索一次数据,数据将会更快地返回,每个请求使用的平均内存将显着降低。

这种caching方法的唯一缺点是,当数据实时更新时,caching数据可能需要10分钟(平均为caching时间的1/2或5分钟),新数据将被回。 由于这种情况只发生在每晚一次,所以对你来说可能不是什么大不了的事情,但是如果你愿意的话,有办法解决这个问题。 例如,您可以在每个请求中检查数据文件的文件date/时间,如果自上次以来没有更改,则只需使用caching版本的数据。 当它改变时,你从磁盘读取它并replacecaching的版本。 这为每个请求增加了一个额外的磁盘I / O操作,但是保证用户总是获得最新版本,同时仍然允许caching版本的好处,当数据实际发生改变时,只需要新读入内存。


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

如果HTML中没有每个用户的自定义设置,或者呈现的HTML中的任何其他内容(从JSON没有改变),那么您可能需要实际caching呈现的HTML,这样所有的必须做的是将其stream式传输到每个请求。