簡體   English   中英

C ++ std :: bad_alloc錯誤

[英]C++ std::bad_alloc error

我正在研究一個C ++程序(C ++ 98)。 它讀取包含許多行(10000行)的文本文件。 這些是制表符分隔值,然后我將其解析為Vector of Vector對象。 但它似乎適用於某些文件(較小)但我的一個文件給我以下錯誤(此文件有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] = tmp 在添加values調整values向量的大小可能會使您的進程臨時需要的內存量增加一倍以上。

  2. 在行的末尾,執行tmp.resize(tmp.size() - 它會縮小向量以適合數據。

  3. 您可以通過將所有值存儲在一個向量中來減少現有代碼中的開銷。

    1. 如果每一行都有不同數量的元素,但您稍后可以順序訪問它們,則可以將空字符串存儲為內部分隔符,它可能比矢量具有更低的開銷。

    2. 如果每一行具有相同數量的值, lineNumber * valuesPerLine行分割會增加不必要的開銷 - 您知道每行中第一個值的索引,它只是lineNumber * valuesPerLine ,其中第一行的編號為0

  4. 內存映射文件。 將每個單詞的開頭和結尾存儲在向量的結構元素中,如果需要將行拆分為行,也可以使用行號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM