在C++中将大型文本文件快速读取为一维结构
Fast read of large text file to 1D structure in C++
我需要快速读取一批大小高达 20mb 的文本文件。
文本文件的格式。数字需要采用双精度,因为其他文件可能具有 3 位小数点精度:
0 0 29 175 175 175 175 174
0 1 29 175 175 175 175 174
0 2 29 28 175 175 175 174
0 3 29 28 175 175 175 174
0 4 29 29 175 175 175 174
.
.
.
我想将每行的最后六个数字存储到一个单一的 1D 结构中,这样它就可以跳过前两列。它基本上转置了每一列,并水平连接了每个转置的列:
29 29 29 29 29 175 175 28 28 29 175 175 175 175 175...
这是我的班级尝试这样做,对于我的目的来说太慢了。
void MyClass::GetFromFile(std::string filename, int headerLinestoSkip, int ColumnstoSkip, int numberOfColumnsIneed)
{
std::ifstream file(filename);
std::string file_line;
double temp;
std::vector<std::vector<double>> temp_vector(numberOfColumnsIneed);
if(file.is_open())
{
SkipLines(file, headerLinestoSkip);
while(getline(file, file_line, 'n'))
{
std::istringstream ss(file_line);
for(int i=0; i<ColumnstoSkip; i++)
{
ss >> temp;
}
for(int i=0; i<numberOfColumnsIneed; i++)
{
ss >> temp;
temp_vector[i].push_back(temp);
}
}
for(int i=0; i<numberOfColumnsIneed; i++)
{
this->ClassMemberVector.insert(this->ClassMemberVector.end(), temp_vector[i].begin(), temp_vector[i].end());
}
}
我已经读到内存映射文件可能会有所帮助,但我尝试将其放入我需要的 1D 结构中并没有成功。某人的例子将不胜感激!
如您所显示的 20mb 和短行,大约是 500 000 行。 知道这一点后,有几个因素可能会减慢您的代码速度:
- I/O :在当前的硬件和操作系统性能下,我无法想象这在这里发挥作用;
- 解析/转换。您读取每一行,从中构建一个字符串流,然后提取数字。 这可能是开销,尤其是在流提取比旧
sscanf()
慢的某些C++实现上。 我可能是错的,但我再次不确定这个开销会如此巨大。 - 矢量的内存分配。 这绝对是第一个要寻找的地方。 向量具有大小和容量。 每次添加超出容量的项目时,都需要重新分配矢量,这可能需要移动并再次移动其所有内容。
我强烈建议您使用探查器执行代码以识别瓶颈。 手动计时在这里会很困难,因为您的循环包含所有潜在问题,但每次迭代肯定会让 std::chrono 以足够的精度测量不同的循环部分。
如果您不能使用探查器,我建议您使用文件大小粗略估计行数,并将其减半。预先预留,然后在每个temp_vector[i]
中保留相应的容量。 如果你观察到一个良好的进展,你将是正确的轨道,然后可以微调这种方法。如果没有,请使用您的新发现编辑您的答案并对此答案发表评论。
相关文章:
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- STL算法函数在多个一维容器上的使用
- 将二维数组的所有元素插入到一维数组中
- C++语法差异:二维和一维数组(指针算术)
- 将一维数组写入 CSV C++中的不同列?
- 蓝牙插座只能读取一次,为什么?
- C++:将矩阵存储在一维数组中
- 读取一组用户输入,按升序排序,然后打印结果
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 如何在一维数组中的每个元素中都有多个int值
- 以C++填充一维数组
- 一维阵列的运动检测(神经网络或其他选项?
- 编写所需的代码以创建动态一维整数数组
- 用于在一维数组上嵌套循环操作的正确 openmp 指令
- 使用两个不同大小的一维阵列制作 2D 阵列
- 如何在 <threads> c++ 中使用和一维数组进行矩阵乘法?
- C++按内存地址将多维数组更改为一维数组
- 在 c++ 中返回一维数组时出错
- 新的一个一维阵列,非常大,例如60000*60000
- 在C++中将大型文本文件快速读取为一维结构