【发布时间】:2014-06-16 06:23:19
【问题描述】:
我想制作一个映射,使一组指针指向动态大小的数组。
我确实使用了带有链接的散列。但由于我使用它的数据量很大,因此程序在几次迭代后会给出std::bad_alloc。原因可能是new用于生成链表。
请有人建议我应该使用哪种数据结构? 或者还有什么可以提高我的哈希表的内存使用率?
程序是 C++。
这是我的代码的样子: 哈希表的初始化:
class Link
{
public:
double iData;
Link* pNext;
Link(double it) : iData(it)
{ }
void displayLink()
{ cout << iData << " "; }
};
class List
{
private:
Link* pFirst;
public:
List()
{ pFirst = NULL; }
void insert(double key)
{
if(pFirst==NULL)
pFirst = new Link(key);
else
{
Link* pLink = new Link(key);
pLink->pNext = pFirst;
pFirst = pLink;
}
}
};
class HashTable
{
public:
int arraySize;
vector<List*> hashArray;
HashTable(int size)
{
hashArray.resize(size);
for(int j=0; j<size; j++)
hashArray[j] = new List;
}
};
主要的sn-p:
int t_sample = 1000;
for(int i=0; i < k; i++) // initialize random position
{
x[i] = (cal_rand() * dom_sizex); //dom_sizex = 20e-10 cal_rand() generates rand no between 0 and 1
y[i] = (cal_rand() * dom_sizey); //dom_sizey = 10e-10
}
for(int t=0; t < t_sample; t++)
{
int size;
size = cell_nox * cell_noy; //size of hash table cell_nox = 212, cell_noy = 424
HashTable theHashTable(size); //make table
int hashValue = 0;
for(int n=0; n<k; n++) // k = 10*212*424
{
int m = x[n] /cell_width; //cell_width = 4.7e-8
int l = y[n] / cell_width;
hashValue = (kx*l)+m;
theHashTable.hashArray[hashValue]->insert(n);
}
-------
-------
}
【问题讨论】:
-
所以您需要在内存中总共存储大约 9 亿个值?即使每个值只有 4 个字节,您也会用完 32 位程序的可用虚拟地址空间。没有任何数据结构改变可以解决这个问题。
-
@T.C.但是人们确实在 Fortran 中运行了这样的模拟。没有办法解决这个问题吗?
-
@aks:好吧 - 您可能会评论您是否需要同时保留每次迭代的所有值,或者是否有某种方法可以更早地处理和丢弃其中一些结果?根据您的数据访问需求,您可能会考虑配置大量交换空间,或将值显式写入磁盘,直到再次需要它们为止。另外,你能编译一个 64 位的应用程序吗?你有多少可用内存?
-
@aks 所以你真的只有大约 900k 的值,并且只是在每次迭代中更新它们而不是创建新的?那么你可能需要在你的代码中寻找内存泄漏。
-
作为 T.C.说,如果它通过几次迭代然后崩溃,这表明它有足够的内存用于初始迭代,但后来泄漏了。更一般地说,
std::unordered_map<key, std::vector<value>>听起来是正确的,除非你有例如连续递增键 - 然后你可以只拥有vector<value>。如果最小和最大长度之间的差异很小,您可能需要考虑使用带有初始长度元素或尾随标记的std::array<>。
标签: c++ data-structures hashtable