[英]C++: How to read large txt file and save to array faster
我想讀一個超過50000行的大型txt文件。
文件樣本:
John 12 1 956 02 818 912 322 43 161 9 002 768 23 79 9 1 115 7 2 18 59 58 989 3 56 82 59 147 86 62 06 10 538 36 694 952 71 0 2 5 67 103 6 295 933 428 9 70 708 6 73 449 57 283 6 48 139 5 140 34 5 9 95 74 892 9 387 172 44 05 67 534 7 79 5 565 417 252 480 22 503 089 76 433 93 36 374 97 035 70 2 896 0 3 0 259 93 92 47 860
description:上面的示例是txt文件中的每一行。 每個字符和字符串除以空格。
目標:我想在第一個單詞(在本例中為John)之后保存整數值並保存到Intager Matrice,其行= txt文件中的行數,列= 100。
這是我的代碼
Mat readInteger(String path_txt_file){
int row = 1;
int col = 100;
Mat return_mat;
Mat tmp_mat= Mat(row, col, CV_32F);
fstream input(path_txt_file);
for (std::string line; getline(input, line);)
{
int posMat = -1;
vector<string> v = split<string>(line, " ");
for (int i = 1; i < v.size(); i++)
{
posMat = posMat + 1;
tmp_mat.at<float>(0, posMat) = atoi(v[i].c_str()); //white
}
return_mat.push_back(tmp_mat);
}
tmp_mat.release();
return return_mat;
}
代碼說明
結果我得到了我想要的結果; 不幸的是 ,當文件太大(我們需要)。 這個過程太慢了。
題
我們怎樣才能改善這個算法。 例如處理大文件1000000行? 我想知道我們是否應該使用多線程?
謝謝
我不知道您是否對原始文件的構造有任何發言權,但您可以建議一些更改。 我不認為閱讀速度慢,但所有的演員都是。 首先拆分緩慢的行,然后首先將其轉換為整數然后再轉換為浮點數。 你也使用Mat.at函數,據我所知,這也不是很快(可能是錯誤的)。 將一行推回到另一個墊也與進行需要時間的復制相同。 它不是很多,但隨着時間的推移累積大文件。
我的建議如下:
創建一個如下所示的結構:
struct Data
{
char[100] FirstWord;
std::array<int, 100> Data;
}
您可以使用二進制文件並將此結構寫入其中,而不是創建文本文件。 (只需看一下二進制文件的寫作: http : //www.cplusplus.com/reference/ostream/ostream/write/ )
如果您再次閱讀該文件,您可以執行以下操作:
ifstream file ("File.dat", ios::in|ios::binary);
if (file.is_open())
{
Data D;
file.read(reinterpet_cast<char*>(&D), sizeof(D));
Mat A(RowSize,ColSize,D.data());
}
這樣你就不需要做所有的施法。 你只需要1份。
希望這可以幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.