【发布时间】:2012-04-12 06:25:15
【问题描述】:
我正在从事一个从 bin 文件中读取数据并处理数据的项目。 bin 文件很大,大约 150MB。我正在尝试使用 fseek 来跳过不需要的数据处理。
我想知道fseek的处理时间是否和fread一样。
谢谢!
【问题讨论】:
-
fseek应该比fread快得多,因为它所做的只是移动一个指针。
我正在从事一个从 bin 文件中读取数据并处理数据的项目。 bin 文件很大,大约 150MB。我正在尝试使用 fseek 来跳过不需要的数据处理。
我想知道fseek的处理时间是否和fread一样。
谢谢!
【问题讨论】:
fseek 应该比fread 快得多,因为它所做的只是移动一个指针。
fseek 只是重新定位内部文件指针,而fread 实际上读取数据。所以我猜fseek应该比fread快很多
如果您真的很想看看屏幕后面发生了什么,请从here 下载glibc 并自己检查:)
【讨论】:
我想知道
fseek的处理时间是否和fread一样。
当然,可能不是,它依赖于实现。
很可能,fseek 只会设置一个内存中的“文件指针”,而不会去磁盘读取任何信息。另一方面,fread 会读取信息。
fseek 到文件位置 149M 后跟 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);
}
【讨论】:
mmap 与普通 fread fseek 相比的性能数据时,此答案将很有帮助