快速阅读文件

时间:2013-10-16 12:40:49

标签: c++ c file input scanf

我的问题是:如何使用C ++或C程序快速读取超过50 MB 的文件(即大约一秒钟)......

我感兴趣的是包含普通整数的文件......

我已经排除了ifstream,因为这个目的太慢了(8-9秒)。

目前,我正在使用fscanf,但仍然非常慢(4秒)....

我100%确定文件的读取方式是问题,而且我不受I / O约束。

你能建议任何替代方案吗?

修改

文件格式:

1 2 41 2 1 5 1 2 ... (integers)

3 个答案:

答案 0 :(得分:2)

尝试使用内存映射文件。尝试谷歌搜索

CreateFileMapping
MapViewOfFile

答案 1 :(得分:1)

要更快地读取数据,您必须减少读取数量并增加数据读取量。

假设最坏的情况,硬盘驱动器必须为每个读取命令进行初始化:

  • 拼盘必须加快速度(需要时间)。
  • 操作系统读取目录结构。
  • 操作系统在目录结构中搜索您的文件。
  • 操作系统告诉硬盘驱动器哪个扇区或盘片&部门阅读 从
  • 硬盘驱动器等待扇区的启动,然后读取 从该部门开始的连续数据。
  • 硬盘驱动器旋转。

除了从该部门阅读之外的所有内容都被视为开销。开销将用于读取是读取一个字节还是读取10k。效率是保持驱动器旋转,这意味着每个“读取”命令读取更多数据。

有许多优化方法:

  • 单个大缓冲区 - 将大量数据读入单个缓冲区 解析缓冲区。
  • 双缓冲或多缓冲 - 使用多个缓冲区 线程可以解析一个缓冲区,而另一个线程读取数据 另一个缓冲区。
  • 内存映射文件 - 操作系统管理文件读取,就像它一样 记忆。

程序之外的其他方法:

  • 通过使用fixed来优化文件数据结构以实现高效读取 记录大小。
  • 减少文件中的片段数量 - 针对一个巨大的片段 硬盘上的连续区域。

答案 2 :(得分:1)

为什么这个文件包含什么内容?使用非常快速而肮脏的标准C程序读取54Mb文件需要半秒钟:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

unsigned char *big_file = NULL;
size_t length;

int main(int argc, char **argv)
{
    FILE *f;
    clock_t start_time, end_time;
    if (argc >= 2)
    {
        start_time = clock();
        f = fopen (argv[1], "rb");
        if (f)
        {
            fseek (f, 0, SEEK_END);
            length = ftell(f);
            fseek (f, 0, SEEK_SET);
            big_file = (unsigned char *)malloc(length);
            if (big_file)
            {
                if (fread (big_file, 1,length, f) == length)
                    printf ("successfully read %lu bytes\n", (unsigned long)length);
                free (big_file);
            }
            fclose (f);
        }
        end_time = clock() - start_time;
        printf ("this took %f second(s)\n", ((double)end_time)/CLOCKS_PER_SEC);
    }
}

输出:

successfully read 54721618 bytes
this took 0.523000 second(s)

警告:在相同的文件上再次运行它会返回:

successfully read 54721618 bytes
this took 0.037000 second(s)

有了这个,你的问题可能需要改写:“好吧,我可以快速阅读,但我需要对该数据做XXX” - 如果“XXX”=“很多“,你可以超过1秒钟分配的0.477秒。