我想阅读一个超过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
说明 上面的示例是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行? 我想知道我们是否应该使用多线程?
感谢
答案 0 :(得分:1)
我不知道您是否对原始文件的构造有任何发言权,但您可以建议进行一些更改。 我不认为阅读速度慢,但所有的演员都是。 首先拆分缓慢的行,然后首先将其转换为整数然后再转换为浮点数。你也使用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份。
希望这有帮助