2011-01-08 47 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