C ++ std :: bad_alloc错误

改变了Gunasekara

我正在研究C ++程序(C ++ 98)。它读取包含很多行(10000行)的文本文件。这些是制表符分隔的值,然后将其解析为Vector对象的Vector。但是,它似乎适用于某些文件(Smaller),但是我的一个文件给了我以下错误(此文件有10000行,它是90MB)。我猜这是与内存相关的问题吗?你能帮我么?

错误

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Abort

void AppManager::go(string customerFile) {

    vector<vector<string> > vals = fileReader(customerFile);

    for (unsigned int i = 0; i < vals.size();i++){

        cout << "New One\n\n";

        for (unsigned int j = 0; j < vals[i].size(); j++){

            cout << vals[i][j] << endl;
        }

        cout << "End New One\n\n";
    }
}

vector<vector<string> > AppManager::fileReader(string fileName) {

    string line;
    vector<vector<string> > values;

    ifstream inputFile(fileName.c_str());

    if (inputFile.is_open()) {

        while (getline(inputFile,line)) {

            std::istringstream iss(line);
            std::string val;
            vector<string> tmp;

            while(std::getline(iss, val, '\t')) {

                tmp.push_back(val);
            }

            values.push_back(tmp);
        }

        inputFile.close();
    }
    else {

        throw string("Error reading the file '" + fileName + "'");
    }

    return values;
}
库巴并没有忘记莫妮卡

您的代码没有错,您只是在可能内存较小的平台上运行,可能是旧的编译器,也可能是旧的C ++库。这一切都对你不利。您必须进行微优化:(

这是您可以做的,首先从挂起最少的水果开始:

  1. 试一下整个文件,只计算行数。然后values.resize(numberOfLines),寻找开始,然后才读取值。当然,你将不会被使用values.push_back了,只是values[lineNumber] = tmpvalues添加矢量时调整其大小可能会暂时使过程所需的内存量增加一倍以上。

  2. 在该行的末尾,执行tmp.resize(tmp.size()-它将缩小向量以使其恰好适合数据。

  3. 通过将所有值存储在一个向量中,可以减少现有代码的开销。

    1. 如果每行具有不同数量的元素,但是您稍后又顺序访问它们,则可以将一个空字符串存储为内部定界符,它的开销可能比向量要低。

    2. 如果每行具有相同数量的值,则将它们按行拆分会增加不必要的开销-您知道每行中第一个值的索引,就是说lineNumber * valuesPerLine,第一行具有number 0

  4. 内存映射文件。将每个单词的开头和结尾存储在向量的结构元素中,如果需要将其分成几行,还可以存储行号。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++ std :: bad_alloc错误

来自分类Dev

C ++向量std :: bad_alloc错误

来自分类Dev

程序中的 C++ 向量 std::bad_alloc 错误

来自分类Dev

C ++奇怪的std :: bad_alloc异常

来自分类Dev

错误更改/ usr /权限后的'std :: bad_alloc'

来自分类Dev

奇怪的std :: bad_alloc

来自分类Dev

Node.js错误“抛出'std :: bad_alloc'what():std :: bad_alloc实例后调用终止”

来自分类Dev

我在C ++程序中遇到bad_alloc错误

来自分类Dev

std :: bad_alloc在内存位置0x002b123c

来自分类Dev

std :: bad_alloc在内存位置0x002b123c

来自分类Dev

抛出'std::bad_alloc'的实例后调用C++终止

来自分类Dev

如何修复“std::bad_alloc”

来自分类Dev

std::bad_alloc 将文本文件中的单个字符存储到向量 C++ 时

来自分类Dev

在尝试对C ++中的对象数组进行排序时,遇到标准错误:bad_alloc?

来自分类Dev

已经创建的向量中的奇怪std :: bad_alloc

来自分类Dev

如果我得到std :: bad_alloc怎么办?

来自分类Dev

大数据集的dijkstra计算期间的std :: bad_alloc

来自分类Dev

如果我得到std :: bad_alloc怎么办?

来自分类Dev

'new'导致std :: bad_alloc在相对不大的分配上

来自分类Dev

级联两个向量时的std :: bad_alloc

来自分类Dev

CPP - 未处理的异常 std::bad_alloc

来自分类Dev

C ++ 11-constexpr上的bad_alloc

来自分类Dev

将opencv :: Mat转换为std :: string会得到std :: bad_alloc

来自分类Dev

当分配超出限制的对象时,Clang无法抛出std :: bad_alloc

来自分类Dev

异常:内存位置0x00e4df90上的std :: bad_alloc

来自分类Dev

为什么在抛出'std :: bad_alloc'实例后终止调用?

来自分类Dev

另一个std :: bad_alloc在内存位置

来自分类Dev

带有QVector的bad_alloc但不带有std :: vector

来自分类Dev

当分配超出限制的对象时,Clang无法引发std :: bad_alloc

Related 相关文章

  1. 1

    C ++ std :: bad_alloc错误

  2. 2

    C ++向量std :: bad_alloc错误

  3. 3

    程序中的 C++ 向量 std::bad_alloc 错误

  4. 4

    C ++奇怪的std :: bad_alloc异常

  5. 5

    错误更改/ usr /权限后的'std :: bad_alloc'

  6. 6

    奇怪的std :: bad_alloc

  7. 7

    Node.js错误“抛出'std :: bad_alloc'what():std :: bad_alloc实例后调用终止”

  8. 8

    我在C ++程序中遇到bad_alloc错误

  9. 9

    std :: bad_alloc在内存位置0x002b123c

  10. 10

    std :: bad_alloc在内存位置0x002b123c

  11. 11

    抛出'std::bad_alloc'的实例后调用C++终止

  12. 12

    如何修复“std::bad_alloc”

  13. 13

    std::bad_alloc 将文本文件中的单个字符存储到向量 C++ 时

  14. 14

    在尝试对C ++中的对象数组进行排序时,遇到标准错误:bad_alloc?

  15. 15

    已经创建的向量中的奇怪std :: bad_alloc

  16. 16

    如果我得到std :: bad_alloc怎么办?

  17. 17

    大数据集的dijkstra计算期间的std :: bad_alloc

  18. 18

    如果我得到std :: bad_alloc怎么办?

  19. 19

    'new'导致std :: bad_alloc在相对不大的分配上

  20. 20

    级联两个向量时的std :: bad_alloc

  21. 21

    CPP - 未处理的异常 std::bad_alloc

  22. 22

    C ++ 11-constexpr上的bad_alloc

  23. 23

    将opencv :: Mat转换为std :: string会得到std :: bad_alloc

  24. 24

    当分配超出限制的对象时,Clang无法抛出std :: bad_alloc

  25. 25

    异常:内存位置0x00e4df90上的std :: bad_alloc

  26. 26

    为什么在抛出'std :: bad_alloc'实例后终止调用?

  27. 27

    另一个std :: bad_alloc在内存位置

  28. 28

    带有QVector的bad_alloc但不带有std :: vector

  29. 29

    当分配超出限制的对象时,Clang无法引发std :: bad_alloc

热门标签

归档