繁体   English   中英

C ++读取整数并从文件浮动

[英]c++ reading ints and float from file

我有一个学校项目,其中有一个* .txt文件,其中包含〜2M行(〜42MB),每行包含行号,列号和值。 我将它们解析为三个向量(int,int,float),但大约需要45秒才能完成。 我正在寻找使它更快的方法。 我想瓶颈是每个元素的迭代,最好加载一行大块的行/列/值并将它们一次放入向量中。 不幸的是,我不知道该怎么做,甚至可能。 我也想坚持使用STL。 有什么办法可以使我更快吗?

谢谢!

文件示例(第一行包含行,列和非零值的计数):

1092689 2331 2049148
1 654 0.272145
1 705 0.019104
2 245 0.812118
2 659 0.598012
2 1043 0.852509
2 1147 0.213949

目前,我正在与:

void LoadFile(const char *NameOfFile, vector<int> &row, 
    vector<int> &col, vector<float> &value) {
    unsigned int columns, rows, countOfValues;
    int rN, cN;
    float val;
    ifstream testData(NameOfFile);
    testData >> rows >> columns >> countOfValues;
    row.reserve(countOfValues);
    col.reserve(countOfValues);
    value.reserve(countOfValues);

    while (testData >> rN >> cN >> val) {
        row.push_back(rN);
        col.push_back(cN);
        value.push_back(val);
    }
testData.close();
}

在寻找解决方案之前,我建议您采取一些步骤来确定瓶颈是从文件中读取数据还是填充向量。 为此,我将对以下操作进行计时:

  1. 从文件中读取数据并丢弃数据。
  2. 使用随机数生成器生成随机数并填充向量。

如果瓶颈是(1),请找到加快从文件读取数据的方法。
如果瓶颈是(2),请找到加快填充向量的方法。

改善阅读瓶颈

使用std::istream::read读取调用中文件的全部内容,然后使用std::istringstream提取数据可以带来一些改进。

改善填充向量的瓶颈

在将数据添加到 vector s之前,请保留大容量,这将减少调整大小的次数。

如果您知道有100万行文本,请在向量中保留1M个元素。 如果向量中的实际项目数少一点或多一点,那么从性能的角度来看并没有太大关系。

PS OP已经在这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM