我的c ++程序有问题;我需要从.csv文件中读取一个矩阵,我希望能够处理矩阵太大而无法存储在内存中的情况。我想过使用try / catch子句,但是我无法使用它;
try {
stringstream convertor(line);
columns=0;
while (getline(convertor, token,','))
{
tmp.push_back(stoi(token));//first vector made by int read from csv file
if (token=="0"){
zero.push_back(make_triplet(rows,columns,0));
contzero++;
}
columns++;
}
matrix.push_back((tmp));
}
catch (std::exception& ba)
{
cerr << "bad_alloc caught: " << ba.what() << '\n';
}
问题在于,如果我将其作为矩阵输入100万x 1百万(对于我的4 Gb ram而言应该太大),它将不会进入catch子句。
处理此问题的正确方法是什么?
答案 0 :(得分:0)
如何使用&#34;稀疏矩阵&#34;?如果矩阵区域的大多数元素为零,则稀疏矩阵是有效的。
Boost上有Sparse Matricies library。它可能适合这个问题。
答案 1 :(得分:0)
如果您打算处理不符合内存的数据,那么您需要将容器存储在磁盘上,并且只在任何给定时间将其中的一部分缓存在内存中。
如果您只想拒绝接受过大的输入,那么您当前的方法存在的问题是无法保证std::bad_alloc
被抛出,实际上,操作系统overcommit记忆,不会为你做那件事。
您可以和通常使用的程序是对内存使用任意限制。如果sizeof(element) * dimension1 * dimension2
大于限制,则通知用户。使限制可配置,以便用户可以根据其可用内存进行设置。根据您要支持的最低内存要求,使用默认值作为限制。