tl:dr 我需要一种方法来更好地管理 C++ 中的内存,同时保留大型数据集。
我目前正在创建一个程序来输出我以后项目所需的数据库,并且我正在努力控制内存。我将程序写入功能级别,以小规模输出我需要的数据集,但是为了将大小增加到我需要的位置并使其保持现实,我需要增加迭代次数。问题是当我这样做时,我的计算机(4gb)内存不足,它必须开始分页,这大大减慢了处理速度。
基本大纲是我正在创建商店,然后为所述商店创建一年的交易数据。创建商店时,会生成一个数字列表,代表交易的每日销售目标,然后随机生成交易,直到达到该数字。这种方法给出了一些我很满意的很好的有机结果。不幸的是,所有这些交易都必须存储在内存中,直到它们输出到我的文件中。
创建事务时,它们会临时存储在一个向量中,在我将向量的副本存储在我的永久存储位置后,我会在该向量上执行 .clear()。
我已经开始尝试移动到 unique_ptr's 进行临时存储,但我不确定它们是否在从生成我的数据的函数返回时被正确删除。
代码是这样的(我删掉了一些与手头问题无关的多余代码)
void store::populateTransactions() {
vector<transaction> tempVec;
int iterate=0, month=0;
double dayTotal=0;
double dayCost=0;
int day=0;
for(int i=0; i<365; i++) {
if(i==dsf[month]) {
month++;
day=0;
}
while(dayTotal<dailySalesTargets[i]) {
tempVec.push_back(transaction(2013, month+1, day+1, 1.25, 1.1));
dayTotal+=tempVec[iterate].returnTotal();
dayCost+=tempVec[iterate].returnCost();
iterate++;
}
day++;
dailyTransactions.push_back(tempVec);
dailyCost.push_back(dayCost);
dailySales.push_back(dayTotal);
tempVec.clear();
dayTotal = 0;
dayCost = 0;
iterate = 0;
}
}
transaction::transaction(int year, int month, int day, double avg, double dev) {
rng random;
transTime = &testing;
testing = random.newTime(year, month, day);
itemCount = round(random.newNum('l', avg, dev,0));
if(itemCount <= 0) {
itemCount = 1;
}
for(int i=0; i<itemCount; i++) {
int select = random.newNum(0,libs::products.products.size());
items.push_back(libs::products.products[select]);
transTotal += items[i].returnPrice();
transCost += items[i].returnCost();
}
}