我的程序中有以下内容
class memModel
{
struct Addrlist
{
vector<string> data;
vector<int> timestamp;
vector<string> client;
}
map<int, Addrlist> AddrMap ; //store based address and list of all accesses
}
在main()中,我从一些文件中读取并将数百万条记录存储到此结构中
int main()
{
memModel newObj ;
ifstream file1("dataStream");
ifstream file2("timeStampSteam");
ifstream file3("clientStream");
ifstream file4("addrStream") ;
string dataSTR,clientSTR;
int time = 0 ;
int addr;
for(int i=0; i<10000000/*10mil*/ ; i++)
{
getline(file1,dataSTR);
getline(file3,clientSTR);
file2 >> time ;
file4 >> hex >> addr ;
newObj.AddrMap[addr].data.push_back(dataSTR) ;
newObj.AddrMap[addr].time.push_back( time) ;
newObj.AddrMap[addr].client.push_back(clientSTR) ;
}
}
所以问题是我的内存不足并得到std :: Bad_alloc异常。此代码适用于较小的数据大小。
我试图了解结构和地图的存储位置。一切都在堆栈上吗? 向量是动态分配的。那些人会去堆吗?
这是我第一次使用大型数据集,所以我想更好地理解这些概念。如何更改此项以确保我正在使用堆并且不会耗尽内存。
答案 0 :(得分:4)
newObj.AddrMap[addr].data[i] = dataSTR ;
newObj.AddrMap[addr].time[i] = time ;
newObj.AddrMap[addr].client[i] = clientSTR ;
这里将三项数据存储到三个向量中。
不幸的是,所有这些向量都是空的,并且它们不包含任何元素。这会导致未定义的行为。
您必须提前使用push_back()
或resize()
这些向量,因此它们的大小足以存储您在此处放置到向量中的项目。
std::vector
operator[]
不会自动创建或调整数组大小。它只访问数组中的现有元素。