【问题标题】:Use fread efficiently to read sparse data高效使用 fread 读取稀疏数据
【发布时间】: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 可以是一个简单的实现吗?我需要考虑文件系统的任何一致性吗?就我而言,我知道当我阅读时没有人写文件。

【问题讨论】:

    标签: c file


    【解决方案1】:

    不仅仅是文件系统,硬盘/固态硬盘也会缓存。此外,Linux 将使用任何备用 RAM 来缓存尽可能多的文件系统,仅在程序分配内存时将其丢弃(我不知道我如何选择缓存的内容)。

    大多数东西都会缓存块,并将未使用的数据替换为程序正在使用的数据,或者与已使用数据接近的数据。您的稀疏访问对于缓存来说将是一项艰巨的工作。

    要考虑两个选项 - 要么 1) 将整个文件读入单个数据块,然后再进行细分(现在 RAM 中的 256MB 数据什么都不是,看看 Web 浏览器的内存消耗,他们真的是内存大户),或 2) 设置 RAM 驱动器并将文件复制到其中,然后再使用它。

    2) 更容易,没有什么比 1) 更快

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多