2017-04-02 74 views
2

我有一个商店,如以下使用FREAD有效地读取数据稀疏

A1 B1 C1 ... A2 B2 C2 ... .... An Bn Cn ... 

数据的文件在这里艾,Bi和词与16个字节的块。每个块Ai Bi Ci ...可能大于1M,n可能是256.我想依次读A1,A2 ... An,然后B1,B2 ... Bn ...

如果我使用fread A1,fseek到A2,fread A2,...,我猜测它浪费了很多IO带宽。 fread可以在每次调用时从磁盘读取4k字节,在执行完fseek之后,最后一个fread的缓存数据可能会丢失。读取完所有的As后,读取B1需要直接从磁盘读取,而不是缓存。

这个假设是否正确?我不确定文件系统是否可以很智能,并且仍然使用B1来保存缓存。如果文件系统无法帮助解决这个问题,我可能不得不将myfread作为fread的包装器,但将256 * 4k数据缓存在我自己的缓冲区中,因此下一轮读取Bs可以更快。 myfread从缓冲区中读取,直到它达到4k,然后它需要fread真实的数据。但我知道fread不是一个简单的API,myfread可以是一个简单的实现吗?我需要考虑文件系统的一致性吗?就我而言,我知道没有人在阅读时写下这些文件。

回答

1

它不只是文件系统,它的hdd/ssd也会缓存。此外,Linux将使用任何备用RAM来缓存尽可能多的文件系统,只有在程序分配内存时才会将其抛弃(我不知道如何选择缓存的内容)。

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

要考虑两种选择 - 要么1)将整个文件读入一个单独的数据块中,稍后再进行细分(现在RAM中的256MB数据没有任何用处,只需查看Web浏览器的内存消耗情况,猪),或2)设置一个RAM驱动器并在使用之前将文件复制到它。

2)更容易,没什么会更快然后1)