使用 NodeJS 在大文件中合并几行或几句话的最佳方法是什么?

What is the optimal way of merge few lines or few words in the large file using NodeJS?

如果有人能提出使用 nodejs 编辑 1MB 到 200MB 大文件的最佳或更好解决方案,我将不胜感激。

我们的流程需要将行合并到文件系统中的现有文件中,我们得到以下格式的更改数据,需要将其合并到更改详细信息中定义的位置的文件系统文件中。

[{"range":{"startLineNumber":3,"startColumn":3,"endLineNumber":3,"endColumn":3},"rangeLength":0,"text":"\n","rangeOffset":4,"forceMoveMarkers":false},{"range":{"startLineNumber":4,"startColumn":1,"endLineNumber":4,"endColumn":1},"rangeLength":0,"text":"\n","rangeOffset":5,"forceMoveMarkers":false},{"range":{"startLineNumber":5,"startColumn":1,"endLineNumber":5,"endColumn":1},"rangeLength":0,"text":"\n","rangeOffset":6,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":1,"endLineNumber":6,"endColumn":1},"rangeLength":0,"text":"f","rangeOffset":7,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":2,"endLineNumber":6,"endColumn":2},"rangeLength":0,"text":"a","rangeOffset":8,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":3,"endLineNumber":6,"endColumn":3},"rangeLength":0,"text":"s","rangeOffset":9,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":4,"endLineNumber":6,"endColumn":4},"rangeLength":0,"text":"d","rangeOffset":10,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":5,"endLineNumber":6,"endColumn":5},"rangeLength":0,"text":"f","rangeOffset":11,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":6,"endLineNumber":6,"endColumn":6},"rangeLength":0,"text":"a","rangeOffset":12,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":7,"endLineNumber":6,"endColumn":7},"rangeLength":0,"text":"s","rangeOffset":13,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":8,"endLineNumber":6,"endColumn":8},"rangeLength":0,"text":"f","rangeOffset":14,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":9,"endLineNumber":6,"endColumn":9},"rangeLength":0,"text":"s","rangeOffset":15,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":10,"endLineNumber":6,"endColumn":10},"rangeLength":0,"text":"a","rangeOffset":16,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":11,"endLineNumber":6,"endColumn":11},"rangeLength":0,"text":"f","rangeOffset":17,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":12,"endLineNumber":6,"endColumn":12},"rangeLength":0,"text":"s","rangeOffset":18,"forceMoveMarkers":false}]

如果我们只是打开整个文件并合并这些细节会起作用,但如果我们非常频繁地获得太多这些更改的细节,它会中断,这可能会导致内存不足问题,因为文件被打开了很多次,这也是一种非常低效的方式。

有一个专门针对c#的类似问题。如果我们以流方式打开文件,nodejs中有类似的例子吗?

fs 模块中有一个名为 appendFile 的函数。它可以让您在文件中附加数据。 Link.

I would appreciate insight from anyone who can suggest the best or better solution in editing large files anyway ranges from 1MB to 200MB using nodejs.

Our process needs to merge lines to an existing file in the filesystem, we get the changed data in the following format which needs to be merged to filesystem file at the position defined in the changed details.

一般OS 文件系统不直接支持将信息插入文件的概念。因此,如果您有一个平面文件并且想要从特定行号开始向其中插入数据,则必须执行以下步骤:

  1. 打开文件并从头开始阅读。
  2. 当您从文件中读取数据时,计算行数,直到达到所需的行号。
  3. 然后,如果要插入新数据,则需要读取更多数据并将要插入的数据量缓冲到内存中。
  4. 然后在要插入数据的插入位置写入文件。
  5. 现在使用您插入的数据大小的另一个缓冲区,轮流读取另一个缓冲区,然后写出前一个缓冲区。
  6. 继续,直到到达文件末尾,所有数据都写回文件(在新插入的数据之后)。
  7. 这具有将插入点之后的所有数据重写回文件的效果,因此它现在将正确地位于文件中的新位置。

如您所知,这对于大文件来说根本没有效率,因为您必须一次读取整个文件一个缓冲区,并且必须写入插入点以及插入点之后的所有内容。

在node.js中,您可以使用fs模块中的功能来执行所有这些步骤,但是您必须编写将它们连接在一起的逻辑,因为没有内置将新数据插入文件同时将现有数据推送到文件中的功能。

There is a similar question aimed specifically at c# here. If we open the file in stream mode, is there similar example in nodejs?

您引用的 C# 示例似乎只是将新数据附加到文件末尾。这在几乎任何文件系统库中都是微不足道的。在 node.js 中,您可以使用 fs.appendFile() 执行此操作,或者您可以在追加模式下打开任何文件句柄,然后写入它。


要更高效地将数据插入文件,您需要使用比单个平面文件更高效的存储系统来存储所有数据。例如,如果您将文件分段存储在大约 100 个行块中,那么要插入数据,您只需重写一个数据块的一部分,然后可能有一些清理过程可以在块获取时重新平衡块边界太大或太小。

为了有效的行管理,您需要维护每个文件片段包含多少行的准确索引,以及片段的顺序。这将允许您以某种固定的成本插入数据,无论整个文件有多大,你最需要做的就是重写一两个数据块,即使整个内容有数百 GB 的大小。

请注意,您实际上是在 OS 文件系统之上构建一个新的文件系统,以便在整个数据中更有效地插入或删除。显然,数据块也可以存储在数据库中并在那里进行管理。


注意,如果这个项目真的是一个编辑器,文本编辑基于行的结构是一个研究得很好的问题,你也可以研究以前项目中使用的架构以获得进一步的想法。研究各种架构的优缺点有点超出了这里典型答案的范围。如果您的系统也是一个 client/server 编辑器,其中更改指令从客户端发送到服务器,这也会影响设计中的一些所需权衡,因为您可能希望在事务数量方面进行不同的权衡或客户端和服务器之间要发送的数据量。

If some other language uses an optimal way then I think it would be better to find that option as you saying nodejs might not have that option.

这与您选择的语言没有任何关系。这是关于现代和典型操作系统如何将数据存储在文件中的。