C++ C++;:如何读取大型txt文件并更快地保存到阵列
我想读一个超过50000行的大型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
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
代码说明
谢谢我不知道您是否对原始文件的构造有任何发言权,但您可以提出一些更改建议。 我不认为阅读速度慢,但所有的演员都是。 首先拆分慢行,然后将其转换为整数,然后再转换为浮点。此外,您还使用了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
预先分配了足够的内存来存储整个数据集。最后,您可能会考虑内存映射文件,尽管我不知道它们在这里有多有用。