创建大型1D矩阵返回出口11

时间:2019-05-19 11:41:00

标签: c++ matrix

我写了一些使用1D数组表示矩阵的代码。我目前正在测试较大的输入尺寸。

当我将50000double* create_matrix_1d(int n_rows, int n_cols) { long long len = (long long ) n_rows * (long long) n_cols; auto* A = new double[len]; int row, col ; for(row = 0; row < n_rows; row++) { for( col = 0; col < n_cols; col++) { int i = col + row * n_cols; A[i] = 1; //static_cast <int> (rand()) % 10 ; } } return A; } 设置为textView.textContainer.exclusionPaths时,程序退出,代码为11。

我尝试打印很多东西。

CGFloat width = [UIScreen mainScreen].bounds.size.width - self.textViewLeading.constant - self.textViewTrailing.constant;
UIBezierPath * exclusionPath = [UIBezierPath bezierPathWithRect:CGRectMake(width - self.timestampContainerWidth.constant, 0, self.timestampContainerWidth.constant, self.timestampContainerHeight.constant)];
self.textView.textContainer.exclusionPaths = @[exclusionPath];

3 个答案:

答案 0 :(得分:1)

让我们计算所需的内存。一个double通常使用8个字节,因此您的矩阵需要:

50000*50000*8 = 20000000000 bytes

记忆力

20000000000 bytes = 20000000000 / 1024 = 19531250 kb

19531250 / 1024 = 19073 Mb

19073  / 1024 = 18.6265 Gb

因此,除非您的计算机具有超过19 Gb的RAM,否则出现内存不足错误是正常的

答案 1 :(得分:0)

答案应该很简单。但是我不确定,因为您没有提供有关编译器,语言和硬件的足够信息。最重要的是,我确实看到一个问题。

但是我们猜想您想知道为什么例程失败。

下一步。我不确定您使用哪种语言。它看起来像普通的旧C,但是出于某种原因,您在注释中使用了关键字auto和static_cast。因此,它应该是C ++。

首先是答案,然后是一些其他评论:

您正在尝试在堆上分配19GB。根据您使用的内存模型和物理RAM的可用性,这很可能会失败。

另外,您在写作

  

int i = col + row * n_cols;

这将导致溢出。

第二:一些改进建议。

如果要取消使用现代C ++,则应使用现代C ++。听起来很奇怪,但是您的代码是C风格的。

如果真的要处理大数据,则可以考虑使用数据库。但是我怀疑您是否真的需要19GB的填充数据。还有其他技术可用于仅存储所需的数据。您需要更改算法。

我评论了您的代码,至少提出了一些改进建议:

// Rows and Cols could be made const. They are not modified in your code
// If you anyway later cast to long long, then you could also make the parameters long long
// You should use unique_ptr to take ownership of the allocated memory
// But this cannot be copied and needs to be "moved" out of the function
// You should use a C++ container to hold your matrix, like a std::vector
double* create_matrix_1d(int n_rows, int n_cols) {
    // You should not use C-Style Cast but static_cast
    long long len = (long long ) n_rows * (long long) n_cols;
    // You should use a unique_ptr to handle the resource
    auto* A = new double[len];

    int row, col ;

    for(row = 0; row < n_rows; row++) {
        for( col = 0; col < n_cols; col++) {
            // The "int i" can most likely hold only (2^32-1)
            // SO you will get an overfolow here
            int i = col + row * n_cols;
            // You wanted to assign an int to a double
            A[i] = 1; //static_cast <int> (rand()) % 10 ;
        }
    }

    return A;
}

希望,这会有所帮助

答案 2 :(得分:0)

文森特已经回答了这个问题。

我只对书面代码发表一些评论:

  • 使用RAII总是更安全,使用vector之类的stdlib数据结构应该有帮助
  • 嵌套循环也可以写为-
for(int i=0; i<nrows*ncols; ++i)
  A[i] = 1.0;

通过映射到vectorized instructions,帮助编译器更加智能。

编码愉快!