我有一个巨大的文件,我正在使用 fopen 和 fgetc 循环读取它。
在 fopen 中读取带有“rb”标志的整个文件大约需要 6 秒,文件中有大约 25k 行。
我想知道; 有什么比 fgetc 更快的方法?首先将所有内容加载到 char* 数组中会更好吗?strcpy 更好吗?
请注意,如果它是 fgetc 的方式会更好,或者我至少能够在数组中逐个字符地获取字符。
有什么比 fgetc 更好的方法?
我有一个巨大的文件,我正在使用 fopen 和 fgetc 循环读取它。
在 fopen 中读取带有“rb”标志的整个文件大约需要 6 秒,文件中有大约 25k 行。
我想知道; 有什么比 fgetc 更快的方法?首先将所有内容加载到 char* 数组中会更好吗?strcpy 更好吗?
请注意,如果它是 fgetc 的方式会更好,或者我至少能够在数组中逐个字符地获取字符。
有什么比 fgetc 更好的方法?
那么 fgetc 已经非常优化了,因为它使用了 fopen 的底层缓冲。只需为每个字符调用一个函数(但不是系统调用)。您可以尝试使用 setbuffer 增加缓冲区大小(正如您所说的正在读取大文件):
#define SIZE 65536
// or use even greater size if appropriate ...
char buffer[SIZE];
fd = fopen(...);
setbuffer(fd, buffer, SIZE);
或者,您是否需要按字符读取字符?
如果文件是文本文件,它可能由大小合理的行组成。然后您可以尝试逐行阅读它,例如使用std::getline(或者,在 C 中,getline(3))
如果您使用的是 Posix 系统,例如 Linux,您可以使用像read(2)或mmap(2 ) 这样的低级系统调用( 2) 。确保有足够大的缓冲区,例如 16Kbytes 或 64KBytes。
顺便说一句,如果在 Linux 上,请尝试time wc yourbigfile
,它应该让您了解读取文件实际所需时间的下限。请记住,有一个文件系统缓存:请参阅http://linuxatemyram.com/了解更多信息。
在我的 6Mbytes 的 Linux 桌面系统wc
上,100Klines 文件需要大约 0.1 秒的实时时间。
也许阅读Advanced Linux Programming,至少如果您在 Posix 系统上运行您的程序。
顺便说一句,您的问题是操作系统,也许是特定于文件系统的。
我的代码的整个问题是,每次我想“返回”一个字符时,我都在使用 fget_pos 和 fset_pos,而 ungetc 显着提高了速度!