如何处理太大而无法存储在内存中的矩阵
How to deal with a matrix too big to be stored in memory?
我的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 100万(对于我的4 Gb ram来说应该太大了)的输入,它就不会进入catch子句。
处理这个问题的正确方法是什么?
使用"稀疏矩阵"如何?如果矩阵的大多数元素面积为零,则稀疏矩阵是有效的。
Boost上有稀疏矩阵库。它可能适合这个问题。
如果您打算处理不适合内存的数据,那么您需要将容器存储在磁盘上,并且在任何给定时间只将部分容器缓存在内存中。
如果您只想拒绝接受过大的输入,那么当前方法的问题是无法保证std::bad_alloc
会被抛出,事实上,过度使用内存的操作系统不会为您这样做。
你能做的和程序通常做的是对内存使用任意的限制。如果sizeof(element) * dimension1 * dimension2
大于限制,则通知用户。使限制可配置,以便用户可以根据可用内存进行设置。根据您想要支持的最小内存需求,使用默认值作为限制。
相关文章:
- 将字符串存储在c++中的稳定内存中
- 类型总是使用其大小存储在内存中吗
- 使用无符号字符数组有效存储内存
- 具有内存顺序的原子负载存储
- CertGetCertificateChain 具有支持的内存存储和证书信任列表
- 为什么 bool 和 _Bool 如果它们在内存中占用 1 个字节,它们只能存储 0 或 1
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 存储在哪个内存段(代码/数据段)类(员工)中?
- 可用存储空间会消耗更多剩余内存吗?
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 将数据存储在内存中以供以后访问
- 英特尔将指令存储在重叠的内存区域
- 整数数据如何以位为单位存储在内存中?不是右对齐吗?
- std::set 是否将对象连续存储在内存中?
- 原子加载和存储与内存顺序放宽
- 我应该以字符形式存储数字以节省内存吗?
- std::unordered_set 中的元素如何存储在C++内存中?
- 是否可以更早地销毁对象,使其存储内存被后续对象重用
- SSE加载/存储内存事务
- 在类- c++中存储内存内容