c处理大文件

时间:2010-09-11 02:43:43

标签: c large-files

我需要解析一个大小可能很多gbs的文件。我想在C中这样做。任何人都可以提出任何方法来实现这个目标吗?

我需要打开和解析的文件是我从mac的硬盘驱动器获取的硬盘驱动器转储。但是,我打算在64位Ubuntu 10.04中运行我的程序。同时考虑到文件大小越大,方法越优化越好。

5 个答案:

答案 0 :(得分:4)

在* nix和Windows上,都有I / O例程的扩展,这些例程触及文件大小,支持大于2GB或4GB的大小。当然,底层文件系统也必须支持大文件。在Windows上,NTFS可以,但FAT不是。这通常称为“大文件支持”。

对于这些目的最重要的两个例程是fseek()ftell(),以便您可以随机访问整个文件。否则,普通fopen()fread()和朋友可以对任何大小的文件进行顺序访问,只要底层操作系统和stdio实现支持大文件。

答案 1 :(得分:1)

假设您使用的是linux / bsd / mac / notwindows 64位系统(严肃地说,现在不是谁?),mmap表现非常好。它基本上允许您将整个文件映射到进程的地址空间,并让内核为您执行缓存/分页。

如果你必须使用Windows,here是相同的概念,但是由Redmond的友好人员制作。请注意,对于其中任何一个,您将希望在64位系统上运行,因为您可以在32位系统上映射的ABSOLUTE最大文件大约为4GB。

答案 2 :(得分:1)

除了RBerteig和Matt的回答:

如果正确且小心地为所有人启用了64位IO支持 你的项目中的文件(方法是systemn 如果你,你不必担心整数溢出 我认为使用正确的类型。 off_t应该是正确的 选择定位文件指针。

如果所有其他方法都失败,请使用正确的C99类型 关于类型宽度的假设。使用intlong是 几乎总是做错事,他们太过分了 编译器/平台依赖。如果您使用int64_t(或int_fast64_t,请使用{ 没有那个。)

答案 3 :(得分:1)

为所有相关来源(最好是整个项目)定义宏-D_FILE_OFFSET_BITS=64#define _FILE_OFFSET_BITS 64。这个常见的宏由几个常见的构建系统自动提供。然后在API需要的地方使用off_t(现在是64位)。

答案 4 :(得分:0)

根据Chomsky level,可能有几个免费和商业工具包来创建文件格式的解析器。我认为您认为存在的真正问题是如何“处理”几GB的数据。

您是否同时想要内存中的所有数据?   一种方法是在不使用时将文件的一部分写入临时文件中的磁盘上。结构的简单fread / fwrite,以及一些聪明的重新计数“按需”加载和写入可以做到这一点,