c - 给 read() 一个起始位置

标签 c node.js file

当你给 read 一个起始位置时 - 它会减慢 read() 的速度吗?它是否必须读取该位置之前的所有内容才能找到它要查找的文本?

换句话说,我们有两个不同的读取命令,

read(fd,1000,2000)
read(fd,50000,51000)

我们给它两个参数:

read(file descriptor, start, end)

有没有办法实现读取,使两个命令花费相同的计算时间?

最佳答案

您没有指定特定的文件系统实现或特定的语言库,因此我将进行一般性评论。

一般来说,文件接口(interface)将直接构建在操作系统级文件接口(interface)之上。在大多数类型驱动器的操作系统级接口(interface)中,可以通过随机访问读取扇区中的数据。驱动器可以查找特定扇区的开头(不读取数据),然后可以读取该扇区,而无需读取文件中该扇区之前的任何数据。因为数据通常是按扇区分块读取的,所以如果您请求的数据没有在扇区边界上完全对齐,操作系统可能会读取包含您请求的第一个字节的整个扇区,但不会很多,而且不会对性能产生有意义的差异,因为一旦读/写头定位正确,通常会在一次 DMA 传输中读取一个扇区。

读取旋转硬盘驱动器的给定字节集的磁盘访问时间并不完全可预测,因此不可能设计一个函数,无论您正在读取哪个字节,都将花费完全相同的时间。这是因为存在操作系统级缓存、磁盘 Controller 级缓存以及读/写头的寻道时间差异,具体取决于读/写头事先执行的操作。如果您的系统上正在运行任何其他进程或服务(总是存在),其中一些进程或服务也可能正在使用磁盘并竞争磁盘访问。此外,根据文件的写入方式、正在读取的字节数以及文件的优化程度,您读取的所有字节可能会也可能不会在一个长可读序列中。驱动器磁头可能必须读取一些字节,然后寻找磁盘上的新位置,然后再读取一些字节。所有这一切都不完全可以预测。

哦,如果是不同类型的驱动器(例如 SSD),其中一些内容会有所不同,因为没有驱动器磁头可供查找。

When you give read a start position - does it slow down read()?

没有。操作系统读取目录条目以找出文件在磁盘上的位置,然后计算所需读取的磁盘位置,查找磁盘上的该位置并开始读取。

Does it have to read everything before the position to find the text it's looking for?

没有。由于它一次读取扇区,因此它可能会在您请求的内容之前读取几个字节(无论扇区中位于它之前的内容),但扇区并不大(通常为 8K),并且通常使用 DMA 一次性读取,因此额外的您所需数据之前的部分扇区不太可能引人注目。

Is there a way to implement read so that the two commands take the same amount of computing time?

所以不,不是真的。即使字节数相同,磁盘读取也会有所不同,具体取决于情况以及计算机上可能发生的其他情况以及操作系统或驱动器本身可能已经缓存的其他内容。

如果您分享您真正想要解决的问题,我们可能会建议替代方法,而不是依赖于给定的磁盘读取花费确切的时间。

关于c - 给 read() 一个起始位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57281330/

相关文章:

c - Pop 无法正常工作 - 起始项目不会出队

c - 甚至可以为 root 锁定设备?

将字符串从指针复制到字符串

c++ - unix 套接字与共享内存消息哪个更快

javascript - 合并两个对象并忽略唯一键

javascript - 在没有模型 :generate? 的情况下在 Sequelize 中创建新模型

node.js - 将流式处理与 Node 和 mssql 结合使用

linux - bash循环仅在最后一个文件上执行命令

file - 如果第一个文件/bash 脚本中存在,则按键合并两个文件

C编程,从文件中读取并加载到数组中