簡體   English   中英

C ++:如何讀取大型txt文件並更快地保存到數組中

[英]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;
}

代碼說明

  1. 我按照經典的方式從txt文件讀取數據逐行讀取
  2. 我創建了兩個Mat,return_mat和tmp_mat
  3. 每次對於行= 1和col = 100的每行tmp_mat用於存儲每行的整數,然后我們根據空格分割字符串,之后我們將整個tmp_mat推送到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM