如何在Linux/Unix中创建大于2GB的文件?

8
我有一个作业,需要使用类似比特流的算法将一个非常大的文件从一个源传输到多台机器。最初,我将文件分成块,并将这些块传输到所有目标。目标有智能性,可以与其他目标共享它们拥有的块。这个方法运行良好。我想传输一个4GB的文件,所以我压缩了四个1GB的文件。当我创建4GB的tar文件时没有出错,但在另一端将所有块组装回原始文件时,出现了“文件大小限制超过”的错误。如何解决这个2GB的限制问题?

你正在运行哪个文件系统、内核版本和发行版/版本? - womble
5个回答

11
我可以想到两个可能的原因:
  • 您的Linux内核未启用大文件支持
  • 您的应用程序没有编译使用大文件支持(您可能需要传递gcc额外标志来告诉它使用某些文件I/O函数的64位版本,例如gcc -D_FILE_OFFSET_BITS=64

不要忘记至少提到文件系统(驱动程序)。一些文件系统具有任意限制。只有Btrfs、ZFS和可能还有其他一些文件系统具有128位能力(例如16 exabytes (16×1018字节) - 单个文件的最大大小)。 - sehe
注意:在正确的架构上,_FILE_OFFSET_BITSO_LARGEFILE传递给open系统调用,但为了可移植性,建议使用_FILE_OFFSET_BITS:https://dev59.com/oHE85IYBdhLWcg3wNgvk - Ciro Santilli OurBigBook.com

4
这取决于文件系统类型。当使用ext3时,我没有遇到那些文件明显较大的问题。
如果底层磁盘是FAT、NTFS或CIFS(SMB),您还必须确保使用适当驱动程序的最新版本。有一些旧的驱动程序会出现像您遇到的文件大小限制问题。

3

这可能与系统限制配置有关吗?

$ ulimit -a
vi /etc/security/limits.conf
vivek       hard  fsize  1024000

如果您不想有任何限制,请从/etc/security/limits.conf中删除fsize

1

你应该使用fseeko和ftello,参见fseeko(3) 请注意,你应该定义#define _FILE_OFFSET_BITS 64

#define _FILE_OFFSET_BITS 64
#include <stdio.h>

1
如果您的系统支持,您可以使用以下命令获取提示:man largefile

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