Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:如何读取大型txt文件并更快地保存到阵列_C++_Arrays_Multithreading_File Io_Profiling - Fatal编程技术网

C++ C++;:如何读取大型txt文件并更快地保存到阵列

C++ C++;:如何读取大型txt文件并更快地保存到阵列,c++,arrays,multithreading,file-io,profiling,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

我想读一个超过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)后保存integer的值,并保存到一个Intager矩阵,该矩阵的行数为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;
}
Mat readInteger(字符串路径\u txt\u文件){
int行=1;
int col=100;
垫返回垫;
Mat tmp_Mat=Mat(行、列、CV_32F);
fstream输入(path_txt_文件);
for(std::字符串行;getline(输入,行);)
{
int posMat=-1;
向量v=拆分(线“”);
对于(int i=1;i
代码说明

  • 我遵循了从txt文件中读取数据的经典方法 逐行阅读
  • 我创建了两个垫子,return_垫子和tmp_垫子
  • 每行每一次 行=1且列=100的tmp_mat用于存储每行的整数 然后我们根据空格分割字符串 之后,我们推动整个tmp_垫返回_垫
  • 结果 我得到了我想要的结果不幸的是,当文件太大时(我们需要它)。这个过程太慢了

    问题

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


    谢谢

    我不知道您是否对原始文件的构造有任何发言权,但您可以提出一些更改建议。 我不认为阅读速度慢,但所有的演员都是。 首先拆分慢行,然后将其转换为整数,然后再转换为浮点。此外,您还使用了Mat.at函数,据我所知,它也不会太快(这可能是错误的)。 另外,将一行推回到另一个垫子上与复制相同,这需要时间。 虽然数量不多,但随着时间的推移,它会随着大文件而累积

    我的建议如下:

    创建如下所示的结构:

    struct Data
    {
        char[100] FirstWord;
        std::array<int, 100> Data;
    }
    
    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());
    }
    
    struct数据
    {
    char[100]第一个字;
    std::数组数据;
    }
    
    您不用创建文本文件,而是使用二进制文件并将此结构写入其中。(只需查看写入二进制文件:)

    如果在中再次读取文件,可以执行以下操作:

    struct Data
    {
        char[100] FirstWord;
        std::array<int, 100> Data;
    }
    
    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());
    }
    
    ifstream文件(“file.dat”,ios::in | ios::binary);
    if(file.is_open())
    {
    数据D;
    read(reinterpet_cast(&D),sizeof(D));
    Mat A(行大小、列大小、D.数据());
    }
    
    这样你就不需要做所有的演员。你只需要一份


    希望这有助于

    1Mio乘以该行319MB,具体取决于程序中的数据类型。。。“太慢”有多慢?使用一个文本文件执行多线程。。。?隐马尔可夫模型。。。(allocatin vectors每行等都不好)“有多慢”:它超过两个小时,仍然从文件中读取。您考虑过使用二进制文件吗?然后,您可以用一条读取指令读取整个数组,但必须在handMuktithReading之前知道数组/向量的大小。读取并不是解决所有性能问题的灵丹妙药。如果磁盘是瓶颈,没有线程池会有帮助。我建议(a)使用探查器,然后(b)改进瓶颈。在没有测试的情况下,我会怀疑I/O操作是最慢的部分,因此某种缓冲(或使用MMF)可能会带来显著的提升。这似乎慢得惊人。一个300mb的文件实际上不应该花费那么长的时间来加载和解析。两个更快的建议:使用普通的
    cin>
    过程填充矩阵的每一行,而不是构建字符串,将字符串拆分为向量,转换每个元素,然后销毁向量。还要确保
    return\u mat
    预先分配了足够的内存来存储整个数据集。最后,您可能会考虑内存映射文件,尽管我不知道它们在这里有多有用。