如何处理一个太大而无法存储在内存中的矩阵?

时间:2015-12-21 15:08:48

标签: c++ exception memory try-catch

我的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子句。

处理此问题的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

如何使用&#34;稀疏矩阵&#34;?如果矩阵区域的大多数元素为零,则稀疏矩阵是有效的。

Boost上有Sparse Matricies library。它可能适合这个问题。

答案 1 :(得分:0)

如果您打算处理不符合内存的数据,那么您需要将容器存储在磁盘上,并且只在任何给定时间将其中的一部分缓存在内存中。

如果您只想拒绝接受过大的输入,那么您当前的方法存在的问题是无法保证std::bad_alloc被抛出,实际上,操作系统overcommit记忆,不会为你做那件事。

您可以和通常使用的程序是对内存使用任意限制。如果sizeof(element) * dimension1 * dimension2大于限制,则通知用户。使限制可配置,以便用户可以根据其可用内存进行设置。根据您要支持的最低内存要求,使用默认值作为限制。