C ++:如何读取大文本文件并更快地保存到数组

时间:2014-05-13 09:22:21

标签: c++ arrays multithreading file-io profiling

我想阅读一个超过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;
}

代码说明

  1. 我按照经典的方式从txt文件中读取数据 逐行阅读
  2. 我创建了两个Mat,return_mat和tmp_mat
  3. 每行一次 其行= 1且col = 100的tmp_mat用于存储每行的整数 然后我们根据空格分割字符串 之后我们将整个tmp_mat推送到return_mat。
  4. 结果 我得到了我想要的结果; 遗憾的是,当文件过大时(我们需要)。这个过程太慢了。

    问题

    我们如何改进这个算法。例如处理大文件1000000行? 我想知道我们是否应该使用多线程?

    感谢

1 个答案:

答案 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份。

希望这有帮助