我需要解析一个大小可能很多gbs的文件。我想在C中这样做。任何人都可以提出任何方法来实现这个目标吗?
我需要打开和解析的文件是我从mac的硬盘驱动器获取的硬盘驱动器转储。但是,我打算在64位Ubuntu 10.04中运行我的程序。同时考虑到文件大小越大,方法越优化越好。
答案 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类型
关于类型宽度的假设。使用int
或long
是
几乎总是做错事,他们太过分了
编译器/平台依赖。如果您使用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,以及一些聪明的重新计数“按需”加载和写入可以做到这一点,