繁体   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