我将不胜感激,任何人都可以提出最佳或更好的解决方案,使用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中是否有类似的示例?
在fs
模块中,有一个名为appendFile
的功能。它可以让您在文件中附加数据。 Link。
我将不胜感激,任何人都可以提出最佳或更好的解决方案,使用nodejs在从1MB到200MB的范围内编辑大文件。
我们的过程需要将行合并到文件系统中的现有文件,我们以以下格式获取已更改的数据,需要将其合并到更改的详细信息中定义的位置的文件系统文件中。
常规OS文件系统不直接支持将信息插入文件的概念。因此,如果您有一个平面文件,并且想从特定的行号开始向其中插入数据,则必须执行以下步骤:
正如您所知道的,这对于大文件来说根本没有效率,因为您必须一次读取整个文件的缓冲区,并且必须在插入点之后插入所有内容。”>
在node.js中,您可以使用fs
模块中的功能来执行所有这些步骤,但是您必须编写逻辑将它们连接在一起,因为没有内置功能可以将新数据插入到文件,同时推送现有数据。
这里有一个专门针对c#的类似问题。如果我们以流模式打开文件,nodejs中是否有类似的示例?
您引用的C#示例似乎只是将新数据附加到文件末尾。在几乎所有文件系统库中这样做都是微不足道的。在node.js中,可以使用
fs.appendFile()
进行此操作,也可以在附加模式下打开任何文件句柄,然后对其进行写入。为了更有效地将数据插入文件,您需要使用比单个平面文件更有效的存储系统来存储所有数据。例如,如果您将文件分块存储在大约100个行块中,那么要插入数据,您只需要重写一个数据块的一部分,然后可能有一些清理过程,如果一个块被获取,则可以重新平衡块边界太大或太小。
为了进行有效的行管理,您需要维护一个准确的索引,以显示每个文件段包含多少行以及显然应该按什么顺序排列。这将允许您以固定的成本插入数据,无论文件大小多少。整个文件是您最需要做的就是重写一两个数据块,即使整个内容的大小为数百GB。
注意,实际上,您将在OS文件系统之上构建一个新的文件系统,以便在整体数据中更有效地进行插入或删除。显然,数据块也可以存储在数据库中并在那里进行管理。
注意,如果这个项目确实是一个编辑器,那么对基于行的结构进行文本编辑是一个研究得非常透彻的问题,您也可以研究先前项目中使用的体系结构以获得进一步的想法。研究各种体系结构的优缺点在这里超出了典型答案的范围。如果您的系统也是客户端/服务器编辑器,更改说明是从客户端发送到服务器的,则这也会影响设计中的某些所需折衷,因为您可能希望在交易数量或交易额方面进行不同的折衷。客户端和服务器之间要发送的数据量。
如果其他语言使用最佳方式,那么我认为最好找到该选项,因为您说nodejs可能没有该选项。
这实际上与您选择的语言没有任何关系。这是关于现代操作系统和典型操作系统如何在文件中存储数据。