0

我必须做一个程序(对于 Linux),其中有一个非常大的索引文件,我必须搜索和解释文件中的数据。现在要注意的是,我只能在任何时候缓存文件的 x 字节(由参数确定),因此如果不是我要查找的数据,我必须从缓存中删除某些数据。

如果我的理解是正确的, fopen (r) 不会将任何内容放入缓存中,只有当我调用 getc 或 fread(指定大小) 时它才会被缓存。

所以我的问题是,假设我使用 fread 并读取 100 个字节,但在检查后,100 个字节中只有 20 个包含我需要的数据;我将如何从缓存中删除无用的 80 字节(或覆盖它)以便从文件中读取更多内容。

编辑通过缓存我的意思是存储在内存中的数据,这使得问题更容易

4

4 回答 4

2

为什么要对缓存进行微观管理?其次,是什么让你认为你可以?在程序的命令行上指定的任何参数都不能控制缓存管理器在内部执行的操作——它可能决定将整个文件读入 RAM,它可能决定不读取任何文件,或者它可能决定举办派对。您对其进行的任何控制都将使用低级 API/系统调用,并且不会非常精细。

于 2012-11-26T23:06:41.940 回答
2

fread's first argument is a pointer to a block of memory. So the way to go about this is to set that pointer to the stuff you want to over write. For example lets say you want to keep bytes 20-40 and overwrite everything else. You could either a) invoke fread on start with a length of 20 then invoke it again on buffer[40] with a size of 60. or b) You could start by defragmenting (ie copy the bytes you want to keep to the start) then invoke fread with a pointer to the next section.

于 2012-11-26T23:01:40.153 回答
1

我认为您可能对这些要求感到困惑,或者可能对给您要求的人感到困惑。您似乎指的是由操作系统管理的缓存,应用程序无需担心。操作系统将确保它不会自动变得太大。

“缓存”的另一个含义是您自己创建的缓存、char*缓冲区或您创建的任何东西,以便在处理数据时将数据临时保存在内存中。这个应该很容易管理自己,只需不为该缓冲区分配太多内存。

于 2012-11-26T23:12:14.843 回答
-1

要丢弃使用 fopen() 打开的文件的读取缓冲区,可以使用 fflush()。另请注意,您可以使用 setvbuf() 控制缓冲区大小。

但是,如果您必须对缓冲进行精确控制,则应该考虑使用 open/read(而不是 fopen/fread)。

于 2012-11-26T23:04:44.253 回答