【问题标题】:Write large binary file in C用C编写大型二进制文件
【发布时间】:2015-11-29 23:26:37
【问题描述】:

我正在使用 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

【问题讨论】:

  • 请出示您的代码。
  • 我写了一个伪代码。告诉我它是否有帮助。
  • 您是否尝试过附加调试器并检查调用堆栈?

标签: c file io binary


【解决方案1】:

Mingw 是 32 位环境,AFAIK 不存在 64 位变体。

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

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

【讨论】:

    【解决方案2】:

    把它写成更小的块。看在上帝的份上,不要尝试malloc 20gb。

    【讨论】:

    • 今天分配 20GB 相当于在 1993 年分配 20MB。
    • 我想知道分配 20gb 需要多长时间,如果可能的话
    • @dreamlax:就像我希望我能飞越全国,但我找不到那么长的飞机。
    • 请问为什么?这两个建议都是“较小的块”并且不分配 20 GB。我应该怎么写这么大的文件?我想我可以做一些生产者/消费者来避免这么大的分配,但是这样编码要容易得多。
    • @papanoel87:如果你的程序突然需要处理超过 20GB 的数据会怎样?生产者/消费者方法不仅会提高可扩展性,还会提高效率。考虑一下 Windows 如何将一个 20GB 的文件从一个位置复制到另一个位置,您认为它会一次加载整个文件吗?
    【解决方案3】:

    根据环境(操作系统、内存模型、文件系统),可能无法创建大于 2 GB 的文件。对于 MSDOS 文件系统尤其如此,当然,如果磁盘空间或分配配额不足,在任何文件系统上都可能如此。

    如果您展示您的代码,我们可以查看算法中是否存在任何内在缺陷并提出替代方案。

    【讨论】:

    • 我使用的是 windows 7 x64,我有 32gb 的内存,我在 NTFS 下。我可以创建大文件,我可以使用“ab”模式或合并多个二进制文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2016-09-20
    • 2017-10-20
    • 2019-03-27
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多