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