Node.js: 像堆栈一样操作文件
Node.js: manipulate file like a stack
我正在设想 node.js 中的实现,它可以像处理堆栈数据结构一样操作磁盘上的文件。
假设文件是 utf-8 编码的纯文本,堆栈的每个元素对应文件中的一个 '\n'
分隔行,堆栈顶部指向该文件的第一行。我想要可以同时读取和写入文件的东西。
const file = new FileAsStack("/path/to/file");
// read the first line from the file,
// also remove that line from the file.
let line = await file.pop();
为了天真地实现这样的接口,我可以简单地将整个文件读入内存,然后.pop()
从内存中读取,并将剩余部分写回磁盘。显然这种做法并不理想。想象一下处理一个 10GB 的文件,它既需要内存又需要 I/O。
使用 fs.read()
我只能读取文件的一部分,因此“读取”部分已解决。但是“写”部分我不知道。我怎样才能有效地只取一行,并将文件的其余部分写回它?我希望我不必将该文件的每个字节读入内存然后写回磁盘...
我依稀记得文件系统中的文件只是指向磁盘上某个位置的指针,有什么方法可以简单地将指针移动到下一行的开头?
我需要深入了解哪些系统调用或任何可以有效执行此操作的东西,但我对低级系统的东西一无所知。感谢您的帮助!
您要求的不是标准文件系统可以做到的。在不重写整个文件的情况下,您不能将数据插入任何传统 OS 文件系统的文件开头。这就是他们的工作方式。
绝对需要能够在不重写整个文件的情况下执行类似操作并且仍然使用传统 OS 文件系统的系统将在常规文件系统之上构建自己的迷你文件系统,以便一个虚拟文件由许多块组成,这些块写入单独的文件或文件的单独块。然后,在这样的系统中,您可以在虚拟文件的开头插入数据,而无需通过将新数据块写入磁盘然后更新虚拟文件索引(存储在其他文件中)来重写任何现有数据表示您的虚拟文件的第一个块现在来自特定位置。此文件索引指定文件中数据块的顺序及其来源。
大多数需要执行此类操作的程序将改为使用数据库来存储记录,然后使用索引和查询来控制顺序,并让底层数据库担心各个位存储在磁盘上的位置。通过这种方式,您可以非常高效地将数据插入结果查询中您想要的任何位置。
我正在设想 node.js 中的实现,它可以像处理堆栈数据结构一样操作磁盘上的文件。
假设文件是 utf-8 编码的纯文本,堆栈的每个元素对应文件中的一个 '\n'
分隔行,堆栈顶部指向该文件的第一行。我想要可以同时读取和写入文件的东西。
const file = new FileAsStack("/path/to/file");
// read the first line from the file,
// also remove that line from the file.
let line = await file.pop();
为了天真地实现这样的接口,我可以简单地将整个文件读入内存,然后.pop()
从内存中读取,并将剩余部分写回磁盘。显然这种做法并不理想。想象一下处理一个 10GB 的文件,它既需要内存又需要 I/O。
使用 fs.read()
我只能读取文件的一部分,因此“读取”部分已解决。但是“写”部分我不知道。我怎样才能有效地只取一行,并将文件的其余部分写回它?我希望我不必将该文件的每个字节读入内存然后写回磁盘...
我依稀记得文件系统中的文件只是指向磁盘上某个位置的指针,有什么方法可以简单地将指针移动到下一行的开头?
我需要深入了解哪些系统调用或任何可以有效执行此操作的东西,但我对低级系统的东西一无所知。感谢您的帮助!
您要求的不是标准文件系统可以做到的。在不重写整个文件的情况下,您不能将数据插入任何传统 OS 文件系统的文件开头。这就是他们的工作方式。
绝对需要能够在不重写整个文件的情况下执行类似操作并且仍然使用传统 OS 文件系统的系统将在常规文件系统之上构建自己的迷你文件系统,以便一个虚拟文件由许多块组成,这些块写入单独的文件或文件的单独块。然后,在这样的系统中,您可以在虚拟文件的开头插入数据,而无需通过将新数据块写入磁盘然后更新虚拟文件索引(存储在其他文件中)来重写任何现有数据表示您的虚拟文件的第一个块现在来自特定位置。此文件索引指定文件中数据块的顺序及其来源。
大多数需要执行此类操作的程序将改为使用数据库来存储记录,然后使用索引和查询来控制顺序,并让底层数据库担心各个位存储在磁盘上的位置。通过这种方式,您可以非常高效地将数据插入结果查询中您想要的任何位置。