Node.js:像堆栈一样操作文件

Node.js:像堆栈一样操作文件,node.js,filesystems,system-calls,Node.js,Filesystems,System Calls,我正在设想node.js中的一个实现,它可以像处理堆栈数据结构一样处理磁盘上的文件 假设文件是utf-8编码的纯文本,堆栈的每个元素对应于文件中的一行分隔线,堆栈顶部指向该文件的第一行。我想要能同时读写文件的东西 const file=newfileasstack(“/path/to/file”); //从文件中读取第一行, //还要从文件中删除该行。 让line=wait file.pop(); 要天真地实现这样的接口,我只需将整个文件读入内存,当.pop()从内存读取时,将剩余部分写回磁盘

我正在设想node.js中的一个实现,它可以像处理堆栈数据结构一样处理磁盘上的文件

假设文件是utf-8编码的纯文本,堆栈的每个元素对应于文件中的一行分隔线,堆栈顶部指向该文件的第一行。我想要能同时读写文件的东西

const file=newfileasstack(“/path/to/file”);
//从文件中读取第一行,
//还要从文件中删除该行。
让line=wait file.pop();
要天真地实现这样的接口,我只需将整个文件读入内存,当
.pop()
从内存读取时,将剩余部分写回磁盘。显然,这种方法并不理想。想象一下,处理一个10GB的文件时,它将同时占用大量内存和I/O

使用
fs.read()
我只能读取文件的一部分,所以“读取”部分就解决了。但是“写”的部分我不知道。如何有效地只取一行,然后将文件的其余部分写回它?我希望我不必把文件的每个字节都读入内存,然后写回磁盘

我模模糊糊地记得,文件系统中的文件只是指向磁盘上某个位置的指针,有没有办法把指针移到下一行的开头


我需要了解什么样的系统调用或任何可以有效地实现这一点的东西,但我对低级系统的东西一无所知。感谢您的帮助

您所要求的不是标准文件系统所能做到的。在任何传统的OS文件系统中,如果不重写整个文件,就无法将数据插入文件的开头。这就是他们的工作方式

如果系统绝对需要能够在不重写整个文件的情况下执行类似操作,并且仍然使用传统的操作系统文件系统,那么它们将在常规文件系统的基础上构建自己的迷你文件系统,以便一个虚拟文件由多个写入单独文件或文件块的片段组成。然后,在这样的系统中,您可以在虚拟文件的开头插入数据,而无需重写任何现有数据,方法是将新的数据块写入磁盘,然后更新虚拟文件索引(存储在其他文件中),以指示虚拟文件的第一个块现在来自特定位置。此文件索引指定文件中数据块的顺序及其来源


大多数需要这样做的程序将使用数据库来存储记录,然后使用索引和查询来控制顺序,并让底层数据库担心单个位存储在磁盘上的位置。通过这种方式,您可以非常高效地在结果查询中的任何位置插入数据。

您所要求的并不是标准文件系统所能做到的。对我来说,这听起来更像是你想要使用一个数据库,它可以以任何高效的方式存储数据,然后按照查询和索引指定的特定顺序将数据返回给你。通过这种方式,您可以将数据添加到查询的开头,而无需重写整个数据文件。哦……听到这个消息很难过。谢谢你的建议,但我确实需要在这个特定的任务中处理本机fs。在任何传统的OS文件系统中,如果不重写整个文件,就不能将数据插入文件的开头。这就是他们的工作方式。您可以在操作系统文件系统的基础上构建自己的文件系统,将数据分解为多个文件,然后拥有一些主索引文件,告诉您各种数据的顺序(类似于虚拟文件)。这样,您就可以在开始时插入数据,而无需重写除主索引之外的任何数据。但是,这可能会变得非常复杂。如果你告诉我们更多关于这里要解决的实际问题和要求(而不是你试图解决的问题),我们可以就什么技术可以最好地用来解决这类问题提出更好的建议。@jfriend00我问这个问题更多的是出于好奇,而不是出于实际原因。当我在预处理一个巨大的数据集时,我想到了一个主意,我想检查处理过的部分。如果不可能,我可以只将偏移量存储到文件中,而不写入它。