我的问题是:如何使用C ++或C程序快速读取超过50 MB 的文件(即大约一秒钟)......
我感兴趣的是包含普通整数的文件......
我已经排除了ifstream,因为这个目的太慢了(8-9秒)。
目前,我正在使用fscanf,但仍然非常慢(4秒)....
我100%确定文件的读取方式是问题,而且我不受I / O约束。
你能建议任何替代方案吗?
修改
文件格式:
1 2 41 2 1 5 1 2 ... (integers)
答案 0 :(得分:2)
尝试使用内存映射文件。尝试谷歌搜索
CreateFileMapping
MapViewOfFile
答案 1 :(得分:1)
要更快地读取数据,您必须减少读取数量并增加数据读取量。
假设最坏的情况,硬盘驱动器必须为每个读取命令进行初始化:
除了从该部门阅读之外的所有内容都被视为开销。开销将用于读取是读取一个字节还是读取10k。效率是保持驱动器旋转,这意味着每个“读取”命令读取更多数据。
有许多优化方法:
程序之外的其他方法:
答案 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秒。