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

问题描述 投票:0回答:2

我将不胜感激,任何人都可以提出最佳或更好的解决方案,使用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#here的类似问题。如果我们以流模式打开文件,nodejs中是否有类似的示例?

node.js large-files nodejs-stream
2个回答
0
投票

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


0
投票

我将不胜感激,任何人都可以提出最佳或更好的解决方案,使用nodejs在从1MB到200MB的范围内编辑大文件。

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

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

  1. 打开文件并从头开始阅读。
  2. 从文件中读取数据时,对行数进行计数,直到达到所需的行号。
  3. 然后,如果要插入新数据,则需要阅读更多内容并将要插入的数据量缓冲到内存中。
  4. 然后在要插入的数据的插入位置写入文件。
  5. 现在使用另一个缓冲区,其大小与您插入的数据大小相同,轮流读取另一个缓冲区,然后写出先前的缓冲区。
  6. 继续直到到达文件末尾,并将所有数据写回到文件中(在新插入的数据之后)。>>
  7. 这具有将插入点之后的所有数据重写回文件的作用,因此它现在将正确地位于文件中的新位置。
  8. 正如您所知道的,这对于大文件来说根本没有效率,因为您必须一次读取整个文件的缓冲区,并且必须在插入点之后插入所有内容。”>

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

这里有一个专门针对c#的类似问题。如果我们以流模式打开文件,nodejs中是否有类似的示例?

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


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

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

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


注意,如果这个项目确实是一个编辑器,那么对基于行的结构进行文本编辑是一个研究得非常透彻的问题,您也可以研究先前项目中使用的体系结构以获得进一步的想法。研究各种体系结构的优缺点在这里超出了典型答案的范围。如果您的系统也是客户端/服务器编辑器,更改说明是从客户端发送到服务器的,则这也会影响设计中的某些所需折衷,因为您可能希望在交易数量或交易额方面进行不同的折衷。客户端和服务器之间要发送的数据量。

如果其他语言使用最佳方式,那么我认为最好找到该选项,因为您说nodejs可能没有该选项。

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

© www.soinside.com 2019 - 2024. All rights reserved.