【问题标题】:Using fseek and fread使用 fseek 和 fread
【发布时间】:2012-04-12 06:25:15
【问题描述】:

我正在从事一个从 bin 文件中读取数据并处理数据的项目。 bin 文件很大,大约 150MB。我正在尝试使用 fseek 来跳过不需要的数据处理。

我想知道fseek的处理时间是否和fread一样。

谢谢!

【问题讨论】:

  • fseek 应该比fread 快得多,因为它所做的只是移动一个指针。

标签: c io fread fseek


【解决方案1】:

fseek 只是重新定位内部文件指针,而fread 实际上读取数据。所以我猜fseek应该比fread快很多

如果您真的很想看看屏幕后面发生了什么,请从here 下载glibc 并自己检查:)

【讨论】:

    【解决方案2】:

    我想知道fseek的处理时间是否和fread一样。

    当然,可能不是,它依赖于实现。

    很可能,fseek 只会设置一个内存中的“文件指针”,而不会去磁盘读取任何信息。另一方面,fread 会读取信息。

    fseek 到文件位置 149M 后跟 1M fread 可能会比 150 次不同的 1M fread 调用快,除了最后一个之外的所有调用都丢弃。

    【讨论】:

      【解决方案3】:

      我可能觉得 fseek 可能比 fread 快一点,因为 fseek 将指针位置更改为您提到的新地址空间并且没有读取日期。

      【讨论】:

        【解决方案4】:

        如果您正在处理大文件,您是否考虑过读取/写入的替代方案? 您可能会发现 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 相比的性能数据时,此答案将很有帮助
        • fseek() fread() 操作是库调用,由 read() 和 lseek() 系统调用支持。 fstream 系列函数将使用缓冲 IO 来提高性能,但仍需要在某些时候进行系统调用。 mmap() 调用是一个单一的系统调用,它代表您依赖操作系统分页缓冲区进出磁盘。如果您发现 fread() 比使用这种方法更快,我会感到惊讶。
        • 从您发布的其他帖子中,我猜您正在处理一些二进制数据文件。如果数据是在具有匹配字节顺序的同一平台上写入的,则使用 mmap() 读取文件中固定大小的字段是微不足道的。只需将结构覆盖在您希望在地图中找到它的位置上,然后直接从结构中读取。
        • 我的意图是,通过添加性能数据,OP 和其他人会更倾向于这种方法(你知道数字比事实更重要:)),你的答案将是 more 有用。
        猜你喜欢
        • 1970-01-01
        • 2021-02-19
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-04
        • 1970-01-01
        相关资源
        最近更新 更多