使用C语言编写大型二进制文件

3
我将使用64位mingw在Windows x64上编译C代码。我使用fwrite从内存数组创建二进制文件。我想调用此函数写入约20GB,但它只能写入1.4~1.5GB,然后停止写入(没有崩溃,只是挂在那里......什么也不做)。有解决方案吗?现在我正在编写20个文件,然后将它们合并。以“ab”模式打开文件可以工作,但如果我使用该模式,则无法正确读取文件。
示例(伪)代码:
    short* dst= malloc(20GB);
    *calculations to fill dst* 
    file=fopen("myfile",'wb');
    fwrite(dst, sizeof(short), 20GB/sizeof(short), file);
    fclose(file)

这个程序永远不会停止,并且文件大小永远不会超过1.5GB。


8
请展示你的代码。 - Eric J.
我写了一份伪代码。告诉我它是否有帮助。 - papanoel87
你尝试过连接调试器并检查调用堆栈吗? - dreamlax
3个回答

6

把它分成更小的块来写。天哪,不要试图使用malloc分配20GB。


2
今天的malloc 20GB相当于在1993年时malloc 20MB。 - dreamlax
1
我想知道分配20GB需要多长时间,如果可能的话。 - Jack
1
@dreamlax:就像我希望能飞越整个国家,但我找不到一架那么长的飞机。 - Mike Dunlavey
1
我可以问一下为什么吗?“更小的块”和不要分配20GB,这两个建议都是为什么?我应该如何编写这样大的文件?我猜我可以使用一些生产者/消费者来避免这种大量分配,但是以这种方式编码要容易得多。 - papanoel87
1
@papanoel87:如果这种编码方式不起作用,争论也没有意义;-)如果您的程序突然需要处理超过20GB的数据,那会发生什么?生产者/消费者方法不仅可以提高可扩展性,还可以提高效率。考虑一下Windows如何将一个20GB的文件从一个位置复制到另一个位置,您认为它会一次性加载整个文件吗? - dreamlax
@Jack 在我的电脑上,这是瞬间完成的。填充需要一段时间,因为你会引起几千个页面错误,让Linux将你的数组与实际的RAM关联起来。 - fuz

1
根据环境(操作系统、内存模型、文件系统)的不同,可能无法创建大于2 GB的文件。特别是在MSDOS文件系统中会出现这种情况,在任何文件系统上,如果磁盘空间或分配配额不足,也可能会出现这种情况。如果您展示代码,我们可以查看算法中是否存在固有缺陷,并建议替代方案。

1
我使用的是Windows 7 x64操作系统,拥有32GB的内存,并且使用NTFS文件系统。我能够创建大文件,可以通过“ab”模式或合并多个二进制文件来实现。 - papanoel87

-1

Mingw是一个32位环境,据我所知不存在64位变体。

可能是因为mingw的fwrite()无法处理超过2GB或4GB的文件,除非mingw具有大文件支持。

如果您能找到类似于truss(1)的东西,请在此调试工具下运行您的程序。根据您提供的信息,我们无法给出更好的建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接