在 Node.js 中读取第 n 行而不读取整个文件

and*_*rew 2 file node.js

我正在尝试使用 Node.js 在 4800 万行文件中获取特定行进行二进制搜索,但我不想将整个文件读入内存。是否有一些功能可以让我阅读 3000 万行?我正在寻找类似Python 的 linecache 模块的东西。

更新它的不同之处:我不想将整个文件读入内存。这个问题被识别为重复读取整个文件到内存。

Bor*_*hev 7

您应该使用Node\xe2\x80\x99s 标准库readline中的模块。我在项目中处理 30-4000 万行文件,这效果很好。

\n\n

如果您想以不太详细的方式执行此操作并且不介意使用第三方依赖项使用nthline

\n\n
const nthline = require(\'nthline\')\n    , filePath = \'/path/to/100-million-rows-file\'\n    , rowNumber = 42\n\nnthline(rowNumber, filePath)\n  .then(line => console.log(line))\n
Run Code Online (Sandbox Code Playgroud)\n


sky*_*ack 5

根据文档,您可以使用fs.createReadStream(path[, options]),其中:

选项可以包括开始结束值,以从文件而不是整个文件中读取一定范围的字节

不幸的是,您必须逼近所需的位置/线,但它似乎不像节点 js 中的查找功能。

编辑

上述解决方案适用于固定长度的线条。

换行符只不过是一个与所有其他字符一样的字符,因此查找换行符就像查找以字符a开头的行。
因此,如果您有可变长度的行,唯一可行的方法是在内存中一次加载一个,并丢弃您不感兴趣的那些。