我目前正在处理大约 2.5GB 内存的非常大的数据集。
我目前正在使用包含 1) 元数据 2) 的类 Data 向量来存储它boost::ptr_list<MemoryBlock>
MemoryBlock 类包含 1) 元数据 2)std::vector<XYZ>
填充时,我std::vector<xyz>
以 50,000 人为一组保留。如果我的向量的空间维度变大,我将创建一个新的内存块并用于
std::vector<XYZ>(Points).swap(Points)
将向量缩小到适当的大小。
现在的问题......似乎当我使用交换技巧调整数组大小时,在清除所有数据并加载新数据集后,我开始遇到 std::bad_alloc 异常。
我可以加载的数据量急剧减少......每次我清除数据并加载新数据集时都会继续这样做......例如,我的初始数据集将加载 100,000,000 个值
下次它将加载 70,000,000 个值
下一次 50,000,000 个值
下一次 20,000,000 个值等...
我的第一个想法是内存泄漏,但我无法识别任何内容。除了交换之外,代码中的每一件事都被广泛使用了很长时间,没有任何问题。
如果我不使用交换/空间维度检查,一切都会继续并正常工作。
有任何想法吗?!?
编辑
bool Check_MemBlock_Size(MemoryBlock &CurrMemblock, XYZ CheckPoint){
// Set a minimum of 5000 points in each memory block regardless of physical size..
if(CurrMemblock.PointsArr.size() > 5000){
XYZ TestMin, TestMax;
TestMin = CurrMemblock.Min;
TestMax = CurrMemblock.Max;
// Check what the bounding box would be if we included the check point..
if(TestMax.x < CheckPoint.x)
TestMax.x = CheckPoint.x;
if(TestMax.y < CheckPoint.y)
TestMax.y = CheckPoint.y;
if(TestMax.z < CheckPoint.z)
TestMax.z = CheckPoint.z;
if(TestMin.x > CheckPoint.x)
TestMin.x = CheckPoint.x;
if(TestMin.y > CheckPoint.y)
TestMin.y = CheckPoint.y;
if(TestMin.z > CheckPoint.z)
TestMin.z = CheckPoint.z;
// If the new bounding box is too big, lets break it off.
if(fabs(TestMax.x - TestMin.x) > 100 || fabs(TestMax.y - TestMin.y) > 100 || fabs(TestMax.z - TestMin.z) > 50){
std::vector<XYZ>(CurrMemblock.PointsArr).swap(CurrMemblock.PointsArr);
return false;
}
}
return true;
}
这是使用此的代码段..
if(Check_MemBlock_Size(*MemBlock, NewPoint) == false){
Data->MemoryBlocks.push_back(MemBlock);
try {
MemBlock = new MemoryBlock();
} catch (std::bad_alloc) {
printf("Not enough memory\n");
delete Buffer;
break;
}
BlockSize = 0;
try{
MemBlock->PointsArr.reserve(MaxBlockSize);
} catch(std::bad_alloc){
delete MemBlock;
delete Buffer;
printf("Not enough memory\n");
break;
}
}
// Push the point to our current memory block
BlockSize++;
MemBlock->PointsArr.push_back(NewPoint);
.... // More stuff going on here.. irrelevant
// push a new memory block if we hit the block point limit.
if(BlockSize >= MaxBlockSize){
Data->MemoryBlocks.push_back(MemBlock);
try {
MemBlock = new MemoryBlock();
} catch (std::bad_alloc) {
printf("Not enough memory\n");
delete Buffer;
break;
}
BlockSize = 0;
try{
MemBlock->PointsArr.reserve(MaxBlockSize);
} catch(std::bad_alloc){
printf("Not enough memory\n");
delete MemBlock;
delete Buffer;
break;
}
}