gpt4 book ai didi

c++ - what(): std::bad_alloc - 我的内存力不足了吗?

转载 作者:行者123 更新时间:2023-11-30 01:14:58 25 4
gpt4 key购买 nike

我的数据集:960 个维度中的 500,000 个点。文件大小为 1.9 GB(1,922,000,000 字节)。

该代码适用于较小的数据集,但为此它每次都会在同一点崩溃。这是一个最小的例子:

#include <iostream>
#include <vector>

template<typename T>
class Division_Euclidean_space {
public:
/**
* The data type.
*/
typedef T FT;

/**
* Constructor, which
* sets 'N' and 'D' to zero.
*/
Division_Euclidean_space()
: N(0),
D(0) {

}

/**
* @param n - size of data
*/
void setSize(size_t& n) {
N = n;
}

/**
* @param n - size of data
*/
void setSize(int n) {
N = n;
}

/**
* Get the number of points
*
* @return - the number of points
*/
const size_t& size() const {
return N;
}

/**
* Get the dimension of points
*
* @return - the dimension
*/
const int dim() {
return D;
}

/**
* @param d - dimension of data
*/
void setDim(int& d) {
D = d;
}

/**
* \brief Inserts a new value to the collection of
* points, held in the private vector.
*
* @param v - value to be inserted
*/
void insert(FT v) {
p.push_back(v);
}

private:
/**
* number of points
*/
size_t N;
/**
* dimension of points
*/
int D;
/**
* vector of points
* Note that indexing is of the form: [i * D + j]
*/
std::vector<FT> p;
};

typedef Division_Euclidean_space<int> Division_space;
typedef Division_space::FT FT;

template<typename T>
void readDivisionSpacefvecs(Division_Euclidean_space<T>& ds, int& N, int& D,
char* filename) {
FILE* fid;
fid = fopen(filename, "rb");
if (!fid)
printf("I/O error : Unable to open the file %s\n", filename);

// we assign the return value of fread() to 'sz' just to suppress a warning
size_t sz = fread(&D, sizeof(D), 1, fid);
fseek(fid, 0L, SEEK_END);
sz = ftell(fid);
N = sz / (1 * 4 + D * 4);
//printf("N = %d, D = %d, |%s|\n", N, D, filename);

fseek(fid, 0L, SEEK_SET);
ds.setSize(N);
ds.setDim(D);
std::cout << ds.dim() << " " << ds.size() << "\n";
int c = 0;
float v;
int i, j;
for (i = 0; i < N; ++i) {
sz = fread(&D, sizeof(D), 1, fid);
//printf("%d\n", D);
for (j = 0; j < D; ++j) {
sz = fread(&v, sizeof(v), 1, fid);
if (c >= 279619)
printf("j = %d, v = %f, read up to point %d\n", j, v, c);
ds.insert(v);
}
++c;
printf("read up to %d\n", c);
}
if (c != N)
printf("WARNING! Read less points than expected.\n");
}

int main() {
Division_space test;
int N, D;
readDivisionSpacefvecs<FT>(test, N, D, "../../parallel/rkd_forest/Datasets/gist/gist_learn.fvecs");

return 0;
}

输出:

...
j = 255, v = 0.052300, read up to point 279620
j = 256, v = 0.052300, read up to point 279620
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted

我是不是记错了?我怎么知道?

这是我有多少内存:

samaras@samaras-A15:~$ free -mt
total used free shared buffers cached
Mem: 3934 2638 1295 0 179 1000
-/+ buffers/cache: 1458 2475
Swap: 3987 0 3987
Total: 7922 2638 5283

最佳答案

std::bad_alloc 表示分配内存时出现问题 - 所以是的,您很可能内存不足。不幸的是,没有一种可靠的方法来“处理”这种异常——您可以捕获它并欣然退出应用程序。

关于c++ - what(): std::bad_alloc - 我的内存力不足了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29309681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com