2013-12-13 21 views
0

我必須讀取和處理50 GB的文件,並且想要按塊執行塊大小爲5 GB的緩衝區大小。問題是每行都有不同的格式和不同數量的參數。一個示例代碼段:帶來n行文件到內存緩衝區

4 A 5 7 
1 2 B 7 9 10 
1 3 B 14 755 9874 
5 A 2 7 
... 

所以,不能做直接fread(. . .)給讀取大小= 5GB,因爲這將可能最終在多個之間。所以,我想讀取從文件緩衝的最大行數,但結尾爲'\n'

一個可能的解決方案可能是在第一次讀取時讀取小於5 GB的1000個字節,並繼續迭代以讀取文件,將seek設置爲文件開始,每次增加一個字節,直到最後一個讀取字節爲' \ N」。但是這個解決方案需要更多的讀取,所以想知道是否有一些更優化的解決方案?


編輯:

我用這個簡單的代碼:

#include <iostream> 
#include <cstdio> 
using namespace std; 

int main() 
{ 
    FILE* fp = fopen("outit", "r"); 
    char *s = new char[1000]; 
    fread(s,1,1000,fp); 
    cout<<s; 
} 

一個小樣本文件只有幾行:

this is a line 
this is another line 
again another one 
more another 

但儘管如此,輸出爲:

this is a line 
this is another line 
again another one 
more anotheram Files (x86)\CodeBlocks\MinGW\bin;C 
:\WINDOWS\system32;C:\WINDO WS;C:\WINDOW 
S\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Progr am Files\Microsoft SQL Server\110\Tools\Binn\;D:\Program Files\MATLAB\R2012b\run time\win64;D:\Program Files\MATLAB\R2012b\bin;C:\Program Files (x86)\Microsoft A SP.NET\ASP.NET Web Pages\v1.0\;C:\Program Files (x86)\Windows Kits\8.0\Windows P erformance Toolkit\;C:\Program Files (x86)\MySQL\MySQL Utilities 1.3.4\ 

什麼和爲什麼垃圾價值?

回答

2
  • 讀取內存中的固定數據量。
  • 找到最後的'\n'(從後面開始搜索)。這將是緩衝區的邏輯 結束。
  • 記住它的位置,這樣你就可以調整下讀

編輯:

輸出的垃圾是因爲緩衝區initialy未初始化幷包含垃圾,因爲沒有終止NULL字符爲cout知道何時停止打印。

當你撥打fread並且不知道你會得到多少輸入時,你需要檢查它的返回值,告訴你它實際讀取了多少個字符。你可以用它來進行相應的設置NUL終止:

int n = fread(s,1,1000,fp); 
s[n] = '\0': 
cout << s; 
+0

對於確切的問題更新問題面臨 –

+0

@BitManipulator我更新了我的答案,你也值得商榷。不要改變這樣的問題,它會使答案無效。只需添加新的信息。希望有所幫助。 – jrok