我正在处理一个从二进制文件中读取并处理数据的项目。这个二进制文件非常大,大约有150MB。我正在尝试使用fseek来跳过不需要处理的数据。
我想知道fseek的处理时间是否与fread相同。
谢谢!
fseek
仅重新定位内部文件指针,而 fread
实际读取数据。因此,我认为 fseek
应该比 fread
快得多。
如果你真的想知道屏幕后面发生了什么,请从这里下载 glibc
并自己查看 :)
fseek
的处理时间是否与 fread
相同。fseek
只会设置一个内存中的“文件指针”,而不会读取任何信息。另一方面,fread
会读取信息。fseek
后,再进行一个 1M 的 fread
,可能比进行 150 次不同的 1M fread
调用更快,且只保留最后一个。我认为fseek可能比fread快一点,因为fseek会将指针位置更改到您提到的新地址空间,并且没有进行数据读取。
#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);
}
fread
fseek
时,此答案将会很有帮助。 - Pavan Manjunath
fseek
应该比fread
快得多,因为它只是移动指针。 - Ilia Frenkel