【问题标题】:Max writeable streams in Node JSNode JS 中的最大可写流
【发布时间】:2017-07-07 17:01:57
【问题描述】:

序幕:

我正在试验“多租户”平面文件数据库系统。在应用程序启动时,在启动服务器之前,每个平面文件数据库(我称之为日志)都被转换为内存中的一个大型 javascript 对象。应用程序从那里开始它的服务。

应用程序运行时行为将服务于来自许多不同数据库的请求(每个域一个 db)。所有读取都来自内存中的对象。虽然任何 CRUD 都会修改内存中的对象并将其流式传输到日志中。

问题: 如果我在内存中有 N 个这样的数据库对象,它们已经从平面文件中加载(假设平均每个大约 1MB),那么拥有 N 个写入流我会处理什么样的限制?

【问题讨论】:

  • 可写流有什么用途?您说您将数据读入内存,所以我不了解可写流的作用。这些流背后是否有文件句柄,或者它们只是您自己对内存中数据的自定义流抽象?
  • 它和日志文件没有什么不同。我正在将内存中的数据库的更改流式传输到一个平面文件中......就像这个fs.createWriteStream('log.txt', {'flags': 'a'})。我可能会打开 1000 个这样的流。我没有对已从日志序列化到内存中的数据库使用流。日志包含数据库的全部历史,内存中的对象只包含最新状态。我也应该提一下。
  • 我问的原因是,如果您使用只进入内存的自定义流,那么除了表示流的 Javascript 对象的内存和您唯一的限制将是内存。如果流后面有文件句柄,那么您对打开文件句柄的系统限制会因操作系统和配置而异。
  • 谢谢@jfriend00 我想这就是我一直在寻找的答案:“打开文件句柄的系统限制”。

标签: node.js database iostream flat-file


【解决方案1】:

如果您使用的流后面有一个打开的文件句柄,那么您可以打开多少个流的限制可能会受到打开文件句柄的进程限制的约束,该进程限制会因操作系统而异,并且(在某些情况下)案例)取决于您如何配置该操作系统。每个打开的流也会消耗一些内存,用于流对象和与流关联的读/写缓冲区。

如果您使用某种只读取/写入内存而不是文件的自定义流,则不会涉及文件句柄,您只会受到流对象及其缓冲区消耗的内存的限制。您可能有数千个这样的问题没有问题。

一些参考帖子:

Node.js and open files limit in linux

How do I change the number of open files limit in Linux?

Check the open FD limit for a given process in Linux

【讨论】:

    猜你喜欢
    • 2013-10-03
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    相关资源
    最近更新 更多