我写了一些使用1D数组表示矩阵的代码。我目前正在测试较大的输入尺寸。
当我将50000
和double* 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];
答案 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)
文森特已经回答了这个问题。
我只对书面代码发表一些评论:
vector
之类的stdlib数据结构应该有帮助for(int i=0; i<nrows*ncols; ++i)
A[i] = 1.0;
通过映射到vectorized instructions,帮助编译器更加智能。
编码愉快!