2011-01-08 90 views
1

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

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

我试了1GB,并得到分割错误,尝试了4MB的罚款。

不确定在不同的平台上有什么字符缓冲区[BUFSIZ]的大小不同?

关于什么是设置缓冲区的最佳大小的任何建议?

感谢

+0

没有理由一次读大块。如果你对数据执行任何不重要的处理,4-64k足够多,它不会提高性能以读取更多内容。如果它是一个没有进行处理的纯副本,您可能会从稍微提高的方面受益,但在任何情况下,您都应该测量并且不要使用比您获得显着益处更大的缓冲区。 – 2011-01-08 21:53:30

回答

3

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

当你像声明数组:

char buffer[BUFSIZ];

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

如果您需要分配一个较大的缓冲区来读取该文件,则需要使用malloc函数族之一将其分配到堆上。

char* buffer = malloc(BUFSIZ); 

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

free(buffer); 
0

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

只需使用read/fread逐块读取它,您就会安全无虞。没有人想要仅仅为了读取文件而填充其内存。 4kB是一个很好的缓冲区大小,因为它通常是内存页面的大小。而且您可以随时将其分配到堆栈上,而不会出现段错误。

+0

使用malloc()如果我设置缓冲区大小的文件正在使用fstat什么是它将容纳的最大大小,说如果文件是4GB,我用char * buffer = malloc(fstat结果),这将是一个问题或者是无限的内存,即没有限制?或者使用malloc()分配多少内存有限制? – daza166 2011-01-08 22:49:01

0

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

3

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

将大文件读入内存可能并不理想,但如果你必须的话,那么你应该先看看使用stat()fstat()函数来找出文件的真实大小,然后使用malloc()/calloc()或使用mmap()动态分配缓冲区。

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

但是,如果你可以避免它,不要将大文件读入内存。相反,一次读取它的位并按照你的要求处理这些位。

+1

(+1)为mmap()建议(http://linux.die.net/man/2/mmap)。文件限制将是内存地址空间的限制。 – 2011-01-08 22:00:48

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