c要在ubuntu中读取的文件的最大大小

时间:2011-01-08 21:47:32

标签: c file-io posix

我想知道如何设置我的缓冲区[]大小,以便在ubuntu中读取文件。

有没有人知道可以使用文件描述符read()从文件中读取的最大大小。

我尝试了1GB并且出现了分段错误,尝试了4MB。

不确定char缓冲区[BUFSIZ]在不同平台上的大小不同?

有关设置缓冲区的最佳大小的建议吗?

谢谢

5 个答案:

答案 0 :(得分:3)

您收到的细分错误与最大文件大小无关。相反,您在堆栈上分配一个超出程序堆栈空间的缓冲区。

声明类似的数组时:

char buffer[BUFSIZ];

...它在stack上分配BUFSIZ个字节。您拥有的堆栈空间量取决于您的平台和编译器,但通常不会像1 GB那样大小。在一些使用gcc的Linux发行版上,默认的堆栈大小是8MB。

如果需要分配一个大缓冲区来读取文件,则需要使用malloc函数系列之一在堆上分配它。

char* buffer = malloc(BUFSIZ);

请记住,完成使用后,您还需要释放缓冲区。

free(buffer);

答案 1 :(得分:3)

使用固定大小的缓冲区可能不是一个好主意。你永远不知道文件有多大,真的......

将大文件读入内存可能也不合适,但如果必须,那么您应该首先使用stat()fstat()函数来查找文件的实际大小,然后使用malloc() / calloc()动态分配缓冲区或使用mmap()

您也可以通过Google查找有关如何使用这些功能的信息。还应该有关于获取文件文件大小的其他方法的信息。

但如果可以避免,请不要将大文件读入内存。相反,一次读取它的位并像处理那样处理这些位。

答案 2 :(得分:0)

请勿立即阅读。 缓冲区大小实际上取决于您能够分配多少。 即几个MB使用堆栈,几乎无限制使用malloc(感谢虚拟内存):在后一种情况下,如果你的文件是几GB,那么你需要那么多内存。

只需使用read / fread逐块读取它,您就会安全。 没人想填充它的内存只是为了读取文件。 4kB是一个很好的缓冲区大小,因为它通常是内存页面的大小。而且您可以在没有segfault的情况下轻松地将其分配到堆栈中。

答案 3 :(得分:0)

读取最大尺寸不一定是最有效的。通常,OS在下面执行缓冲,因此请求的大小并不总是非常重要。但是,读取扇区大小(通常为4K)对于顺序读取来说是一个很好的大小。

答案 4 :(得分:0)

不要忘记每个文件系统类型都有自己的文件大小限制:

  • IBM通用并行文件系统= 2 ^ 99
  • XFS = 8 EiB = 8 * 2 ^ 60
  • OCFS = 4 PiB = 4 * 2 ^ 50
  • ext4 = 16 TiB = 16 * 2 ^ 40
  • ext2 / ext3 = 2 TiB = 2 * 2 ^ 40