硬盘和RAM上文件大小的差异

时间:2015-10-11 16:47:05

标签: c++

我有一个36MB的数据文件(文件中的每个值都是双重类型)驻留在硬盘上。我的问题是,当我通过RAM中的c ++读取此文件时将内容放入矩阵(由boost库提供),它是否只占用36MB RAM或不同?我的内存耗尽吗?

原因是我在64位ubuntu平台上有8 GB RAM,我的分配错误很差。相同的文件读取程序适用于小型数据文件。

以下是加载(数据真实模拟)[https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary.html]的代码段。 x和y是升压矩阵和向量,分别在.h文件中声明为extern

void load_data(const char* filename)
{
   ifstream in(filename);
   string line;
    int line_num = 0;
    if (in.is_open()) {
        while (in.good()) {
            getline(in, line);
            if (line.empty()) continue;
            int cat = 0;
            if (!parse_line(line, cat, line_num)) {
                cout << "parse line: " << line << ", failed.." << endl;
                continue;
            }

            y(line_num) = cat;

            line_num += 1;
        }
        in.close();
    }
 }

bool debug = false;
using namespace boost::numeric::ublas;
vector<double> y(no_records);
matrix<double> x(no_records,no_features);
using namespace std;

template < class T>
void convert_from_string(T& value, const string& s)
{
stringstream ss(s);
ss >> value;
}

int get_cat(const string& data) {
int c;
convert_from_string(c, data);

return c;
} 


bool get_features(const string& data, int& index, double& value) {
int pos = data.find(":");
if (pos == -1) return false;
convert_from_string(index, data.substr(0, pos));
convert_from_string(value, data.substr(pos + 1));

return true;
}


bool parse_line(const string& line, int& cat, const int line_num) {
if (line.empty()) return false;
size_t start_pos = 0;
char space = ' ';

while (true) {
    size_t pos = line.find(space, start_pos);

    if ((int)pos != -1) {
        string data = line.substr(start_pos, pos - start_pos);
        if (!data.empty()) {
            if (start_pos == 0) {
                cat = get_cat(data);
            }
            else {
                int index = -1;
                double v = 0;
                get_features(data, index, v);
                if (debug)
                    cout << "index: " << index << "," << "value: " << v << endl;
                if (index != -1) {
                    index -= 1; // index from 0
                    x(line_num, index) = v;
                }
            }
        }
        start_pos = pos + 1;
    }
    else {
        string data = line.substr(start_pos, pos - start_pos);
        if (!data.empty()) {
            cout << "read data: " << data << endl;
            int index = -1;
            double v = 0;
            get_features(data, index, v);
            if (debug)
                cout << "index: " << index << "," << "value: " << v << endl;
            if (index != -1) {
                index -= 1; // index from 0
                x(line_num, index) = v;
            }
        }
        break;
    }
}

return true;
}

1 个答案:

答案 0 :(得分:0)

我找到了罪魁祸首。 UIButton错误的原因是我的内存不足。问题是我使用bad allocation表示(由boost库提供)。因此,将大小为dense matrix的矩阵作为密集矩阵存储在增强矩阵表示中将需要大小为20000x40000的RAM。现在,如果一个人在RAM中没有那么多空间,那么就会弹出错误的分配。