fs.writeFile执行顺序IO还是随机IO?

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

我正在学习顺序与随机文件 IO,它引起了我的注意,Node

fs
文档没有提及
fs.writeFile
函数是否执行顺序或随机 IO。与读取文件相关的功能也是如此。

也许平台的文件 API 隐含的是顺序的。也许抽象根据文件大小等因素决定顺序或随机。我不知道。不管怎样,我在这件事上是新手,希望能更清楚地了解这个话题。

当 NodeJS 新手从入门页面获取

fs
代码时,它到底在做什么?顺序IO还是随机IO?使用
fs
API 时我们可以选择其中之一吗?

const fs = require('fs');
const content = 'Some content!';
fs.writeFile('/Users/joe/test.txt', content, err => {
  if (err) {
    console.error(err);
  }
  // file written successfully
});
node.js file-io
1个回答
0
投票

如果您查看内部代码

fs.writeFile()
调用
writeFileHandle()
,它会按照此常量定义的最大块大小写入数据:

const kWriteFileMaxChunkSize = 512 * 1024;

因此,对于 512k 或更少的文件,该文件将在一次调用操作系统时写入。否则,它将被分成连续的 512k 写入。

现在,至于这更接近顺序IO还是随机IO,那就有点复杂了。如果操作系统中的任何其他进程没有在磁盘上发生任何其他事情,并且磁盘没有碎片,那么这些连续的 512k 写入很可能是顺序写入。

但是,如果操作系统在磁盘上的其他进程中执行其他操作,则可能需要在多次写入之间移动磁盘头来处理其他进程,这可能更像随机 IO,因为有磁头会在每次写入之间寻找磁盘的新部分。但是,由于这些仍然是 512k 写入(不是非常小),因此每个 512k 写入仍然存在顺序 IO 的问题。因此,由于其他磁盘活动交错,它最终可能会大部分是顺序的,但偶尔是随机的。

如果磁盘碎片严重,那么所有的赌注都将落空,因为即使是 512k 写入也可能必须将该写入的不同块放入磁盘的非连续部分。

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