我必须分析一个16 GB的文件。我正在使用fread()
和fseek()
按顺序阅读文件。这可行吗? fread()
会对这么大的文件起作用吗?
答案 0 :(得分:6)
你没有提到一种语言,所以我将假设C。
我发现fread
没有任何问题,但fseek
和ftell
可能存在问题。
这些函数使用long int
作为数据类型来保存文件位置,而不是fpos_t
甚至size_t
之类的智能。这意味着它们可能无法处理超过2 GB的文件,并且肯定会在16 GB文件上失败。
您需要了解平台上long int
的大小。如果它是64位,你没事。如果是32,则在使用ftell
测量距文件开头的距离时可能会出现问题。
请考虑使用fgetpos
和fsetpos
。
答案 1 :(得分:4)
感谢您的回复。我弄清楚我哪里出错了。 fseek()
和ftell()
不适用于大于4GB的文件。我使用了_fseeki64()
和_ftelli64()
,现在工作正常。
答案 2 :(得分:3)
如果正确实施,这应该不是问题。我假设您按顺序表示您正在以离散块的形式查看文件并推进文件指针。
查看http://www.computing.net/answers/programming/using-fread-with-a-large-file-/10254.html
听起来他和你做的几乎一样。
答案 3 :(得分:2)
这取决于你想做什么。如果你想在内存中读取整个16GB的数据,那么你可能会耗尽内存或应用程序堆空间。
而是按块读取数据块并对这些块进行处理(完成后还有免费资源)。
但是,除了这一切之外,还要确定你想要做哪种方法(使用fread()
或istream
等)并做一些测试用例,看看哪种方法更适合你。
答案 4 :(得分:2)
如果您使用的是POSIX-ish系统,则需要确保使用64位文件偏移支持构建程序。 POSIX要求(或者至少允许,并且大多数系统强制执行此操作)实现拒绝对大小不适合off_t
的文件执行IO操作,即使正在执行的唯一IO是顺序的而没有搜索。
在Linux上,这意味着您需要在-D_FILE_OFFSET_BITS=64
命令行上使用gcc
。