【发布时间】:2017-08-27 03:09:38
【问题描述】:
我有一个存储数据的文件,如下所示
A1 B1 C1 ... A2 B2 C2 ... .... An Bn Cn ...
这里的 Ai、Bi 和 Ci 是 16 字节的块。每个块Ai Bi Ci ...可能>1M大,n可能是256。我想依次读取A1,A2...An,然后依次读取B1,B2...Bn...
如果我使用 fread A1, fseek to A2, fread A2, ...,我想这会浪费很多 IO 带宽。 fread 可以在每次调用时从磁盘读取 4k 字节,在我执行 fseek 之后,最后一次 fread 的缓存数据可能会丢失。读取所有As后,读取B1需要直接从磁盘读取而不是缓存。
这个假设正确吗?我不确定文件系统是否可以智能并且仍然使用 B1 保留缓存。如果文件系统对这种情况没有帮助,我可能必须实现 myfread ,它是 fread 的包装器,但会将 256 * 4k 数据缓存在我自己的缓冲区中,因此下一轮读取 Bs 可以更快。 myfread 从缓冲区读取,直到超过 4k,然后它需要 fread 实际数据。但我知道 fread 不是一个简单的 API,myfread 可以是一个简单的实现吗?我需要考虑文件系统的任何一致性吗?就我而言,我知道当我阅读时没有人写文件。
【问题讨论】: