我正在从事一个从bin文件中读取数据并处理数据的项目。bin 文件很大,大约 150MB。我正在尝试使用 fseek 跳过不需要的数据处理。
我想知道 fseek 的处理时间是否与 fread 相同。
谢谢!
fseek
只是重新定位内部文件指针,而fread
实际上是读取数据。所以我想fseek
应该比fread
快得多
如果您真的很想看看屏幕后面发生了什么,请从这里下载glibc
并自行检查:)
我想知道
fseek
的处理时间是否与fread
相同。
当然,可能不是,它依赖于实现。
最有可能的是,fseek
只会设置内存中的"文件指针",而不会去磁盘读取任何信息。 另一方面,fread
会读取信息。
提交位置 149M 的fseek
,然后是 1M fread
,可能比 150 个不同的 1M fread
调用更快,除了最后一个之外,其他所有调用都扔掉了。
我可能觉得 fseek 可能比 fread 快一点,因为 fseek 将指针位置更改为您提到的新地址空间,并且没有发生读取日期。
如果您正在处理大文件,您是否考虑过读/写的替代方案?您可能会发现mmap()(UNIX)或MapViewOfFile(Windows)是更合适的选择。下面的 UNIX 示例演示如何打开一个文件以读取和计算 ASCII 字符"Q"的出现。注意 - 省略了所有错误检查,以使示例更短。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int i, fd, len, total;
char *map, *ptr;
fd = open("/tmp/mybigfile", O_RDONLY);
len = lseek(fd, SEEK_END, 0);
map = (char *)mmap(0, len, PROT_READ, MAP_SHARED, fd, 0);
total = 0;
for (i=0; i<len; i++) {
if (map[i] == 'Q') total++;
}
printf("Found %d instances of 'Q'n");
munmap(map, len);
close(fd);
}