从特定位置打开文件?

我在问,如果你有一个特别大的文件,说明 64 MEGABYTES,是否可以确定数据的物理硬盘驱动器区域,然后从特定偏移量读取字节到文件中?

允许声称我对 100 字节感兴趣,从文件开头偏移 60 兆字节。 如果我使用某些应用程序级别的 seek() 函数,我不希望从文档的开头获取整个文档肯定需要的数千次磁盘查找的无效性。

有解决方案吗?

非常感谢!

0
2022-06-07 14:41:31
资源 分享
答案: 3

重读,感觉好像我没有解决潜在的问题:

在应用程序(真正地,位)度上使用“seek”不一定会在磁盘上花费任何“seek” - 它所做的只是更新与数据句柄连接的计数器数。

一旦您要求内核读取或写入,它肯定会将该偏移量转换为平衡的磁盘,其中可能包括读取块以解决该问题,但是具有理想的一次查找成本-就像您的直接可访问性一样肯定会的。

绝对有可能做到这一点:这正是文件系统司机所做的,但是,其他人也需要这样做。 您所需要的只是对原始磁盘的可访问性。

那里 例子 个人为现有数据系统样式执行此操作。 如果您愿意,您还可以手动执行此操作。

如果数据系统处于活跃使用状态,您将面临一些技术挑战,使其变得更加困难 - 因为磁盘上的 Web 内容正在以您无法公平看到的方式发生变化 - 但它仍然是可行的。

你也可以直接问位; xfs_bmap 设备可以做到这一点,并且至少一些文档系统实现了完全相同的界面,因此您可以直接询问。

但是,计算位置将需要与该位肯定需要的完全相同的查找次数,因此您不太可能真正节省任何事物这样做。

1
2022-06-07 15:10:30
资源

我不相信。

如果您打开文件,您将处于开头(用于读/写)或结尾(用于追加)。 即使在“更新模式”下,您也不会简单地落在文件中心的某个已定义位置。

我假设你能做的最好的事情就是你已经逃避的事情:如果你能从一开始就确定平衡,你可能会直接寻找那个位置并读取数据。 我不相信这将需要任何极端的读取程序。 你下次打开文件后阅读需要去计算平衡出来。

0
2022-06-07 15:10:26
资源

您似乎对 seek() 的行为方式有错误的印象。 它确实找到了尽可能有效地保存此计数器的信息的位置,而无需读取以字节为单位的步进。 将有几次寻找(很可能不是数百次)来遍历块索引。

您不能做的是保存从文件打开到下一次的块索引遍历。 操作系统当然必须记住,自上次打开以来,文档没有被更改或移动,这需要记住大量信息才能获得极小的潜在收益。

请注意,文件的内容通常不在连续的磁盘设置中。 文件往往是碎片化的。 文件系统通常会尝试减少碎片,但这不能作为一个整体来确保。

5
2022-06-07 15:10:21
资源