2008-11-05 36 views
3

創建C++約50的純文本文件 - 100 MB 與「新增第一線」應該插入的內容到文件使用老式銼4萬次在C++中創建大文件的最快方法?

+0

我想這一切都取決於你想要在文件中的「文本」,以及你的意思是「最好的」。最快的? 我想,重複編寫一個包含一些示例文本的緩衝區會使您在那裏獲得最快的速度。選擇緩衝區的大小以獲得最佳速度需要進行試驗。 – 2008-11-05 15:44:16

+1

'拉赫'是一個印度單詞10,000。 – ijw 2009-05-05 11:49:13

回答

15

IO

的fopen寫入文件。

FSEEK到所需的文件大小 - 1.

fwrite的單個字節

FCLOSE文件

+0

1)忘記了「添加的第一行」 2)沒有在所有操作系統/文件系統上物理分配。有些人留下中間塊未分配。 raj應該知道磁盤空間是否真的必須物理分配或者只能邏輯分配。 – blabla999 2009-01-13 20:23:34

+0

什麼是 40萬時間 是什麼意思? – EvilTeach 2009-01-13 21:25:13

10

創造了一定大小的文件是最快的方式使用creat()或open()創建零長度文件,然後使用chsize()更改大小。這將簡單地爲文件分配磁盤上的塊,內容將是這些塊()中發生的任何事情。這是非常快的,因爲沒有緩衝區寫入需要發生。

2

不知道我明白這個問題。你想確保文件中的每個字符都是可打印的ASCII字符嗎?如果是這樣,那麼呢?與填充文件「abcdefghabc ......」

#include <stdio.h> 
int main() 
{ 
    const int FILE_SiZE = 50000; //size in KB 
    const int BUFFER_SIZE = 1024; 
    char buffer [BUFFER_SIZE + 1]; 
    int i; 
    for(i = 0; i < BUFFER_SIZE; i++) 
     buffer[i] = (char)(i%8 + 'a'); 
    buffer[BUFFER_SIZE] = '\0'; 

    FILE *pFile = fopen ("somefile.txt", "w"); 
    for (i = 0; i < FILE_SIZE; i++) 
    fprintf(pFile, buffer); 

    fclose(pFile); 

    return 0; 
} 
1

您沒有提到的操作系統,但我會假設科瑞/開啓/關閉/寫都可以。

對於真正有效的寫作和假設,比如說,一個4K頁面和磁盤塊的大小和重複的字符串:

  1. 打開該文件。
  2. 在重複字符串中分配4k *字符數,理想情況下與頁面邊界對齊。
  3. 將重複字符串打印到內存中4k次,精確填充塊。
  4. 使用write()根據需要多次將塊寫出到磁盤。您可能希望爲最後一個塊編寫一個部分塊以使大小正確出來。
  5. 關閉文件。

這將忽略fopen()和朋友,這是好的和壞的緩衝:其緩衝意味着他們是很好,速度很快,但他們仍然不會被視爲有效,因爲這,它沒有與緩衝區一起工作的開銷。

這可以很容易地用C++或C編寫,但是爲了效率的緣故,假設你將使用POSIX調用而不是iostream或stdio,所以它不在覈心庫規範中。

0

在C++中創建大文件的最快方法? 好的。我認爲最快的方式意味着最短的運行時間。

用C++創建一個平面文本文件,大約50 - 100 MB,內容'添加第一行'應該插入到文件中400萬次。

預分配使用舊樣式文件的文件IO

fopen the file for write. 
fseek to the desired file size - 1. 
fwrite a single byte 
fclose the file 

create a string containing the "Added first line\n" a thousand times. 
find it's length. 

預分配使用舊樣式文件的文件IO

fopen the file for write. 
fseek to the the string length * 4000 
fwrite a single byte 
fclose the file 

open the file for read/write 
loop 4000 times, 
    writing the string to the file. 
close the file. 

這是我最好的猜測。 我相信有很多方法可以做到這一點。

相關問題