有效地将文件读取到2d数组

Reading file to the 2d array efficently

本文关键字:2d 数组 读取 文件 有效地      更新时间:2023-10-16

我有两个大文件一个是int,另一个是float。我想将它们存储在2d vector中。

读取这样的数据最快的方法是什么?

注意:每行元素的个数在整个文档中是唯一的。

我做了什么?

std::string temp;
std::ifstream infile(Path);
int i=0;
std::vector<std::vector<float> data(100, std::vector<float>(1000));
while (std::getline(infile, temp))
    {
        std::istringstream buffer(temp);
        int j = 0;
        while (!buffer.eof())
        {
            float temp2;
            buffer >> temp2;
            if (buffer.fail())
            {
                throw "Undefined variable in the input file!";
            }
                data.at(i).at(j) = temp2;
            j++;
        }
        i++;
    }

这个代码非常慢!

如果元素(和行)的数量是唯一的,则不能使用预大小的向量和索引。
它不仅会在元素多于预期时中断,而且所有未替换的元素都将为零(或空)。

相反,从空向量开始并使用push_back
为了避免重新分配向量,您可以先使用reserve

像这样:

std::string line;
std::ifstream infile(Path);
std::vector<std::vector<float>> data;
data.reserve(100);  // Assuming no more than 100 lines
while (std::getline(infile, line))
{
    data.emplace_back();
    std::vector<float>& row = data.back();
    row.reserve(1000); // Assuming 1000 elements will do
    std::istringstream buffer(line);
    float element = 0;
    while (buffer >> element)
    {
        row.push_back(element);
    }
}

如果您想要尽可能快地阅读,请不要使用文本格式的数据。

几点提示,

  1. 通过添加:

    std::ios::sync_with_stdio(false);
    

在你的代码的顶部。

  • 重用std::istringstream, put:

    std::istringstream buffer(temp);
    
  • 在循环之外,使用buffer.clear();

    将其清除
  • 而不是:

    data.at(i).at(j) = temp2;
    
  • 使用:

    data[i][j] = temp2;
    

    这个版本不检查边界,所以它稍微快一些。