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

How to deal with a matrix too big to be stored in memory?

本文关键字:存储 内存 何处理 处理      更新时间:2023-10-16

我的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大于限制,则通知用户。使限制可配置,以便用户可以根据可用内存进行设置。根据您想要支持的最小内存需求,使用默认值作为限制。