如何提高hash结构的装载速度?

tp_linkcoco 2008-09-01 06:27:26
我想把大概6万个词条(平均6个字节)装入hash结构,所用hash 是根据Kazlib改编的。
即:数组 + 链接桶。

根据负载率动态调整hash的数组的大小。

现在的问题是:
我装入6万个词条,需要大概6万次内存申请,需要5分钟左右才能转入完毕,根据调试确实是因为内存申请次数太多造成的。

想要的解决办法:
提高装载速度,怎样可以预先申请那些内存?或者第一次装载完后,把内存的内容直接写入文件,以后通过读文件重建hash?
...全文
183 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
tp_linkcoco 2008-09-01
  • 打赏
  • 举报
回复
hash的结构体是这么声明的:


typedef uint32_t hash_val_t;
#define HASH_VAL_MAX ((hash_val_t)(~0))

typedef int (*hash_comp_t)(const void*, size_t, const void*, size_t);
typedef hash_val_t (*hash_fun_t)(const void *, size_t len);
typedef int (*data_construct_t)(void **);
typedef int (*data_destroy_t)(void *);

typedef struct zfs_hsnode_t zfs_hsnode_t;
typedef struct zfs_hashs_t zfs_hashs_t;

struct zfs_hsnode_t{
zfs_hsnode_t *next;
void *key;
size_t key_len;
void *data;
hash_val_t hkey;
};

struct zfs_hashs_t{
int is_dynamic;
zfs_hsnode_t **table;
hash_val_t nchains;
hash_val_t node_count;
hash_val_t max_count;
hash_val_t high_mark;
hash_val_t low_mark;
hash_val_t mask;
hash_val_t init_size;

/*callback functions*/
hash_comp_t key_comp;
hash_fun_t hkey_generator;
data_construct_t constructor;
data_destroy_t destroy;
};


另外,内存申请是通过malloc/free的
tp_linkcoco 2008-09-01
  • 打赏
  • 举报
回复
hash的结构体是这么声明的:


typedef uint32_t hash_val_t;
#define HASH_VAL_MAX ((hash_val_t)(~0))

typedef int (*hash_comp_t)(const void*, size_t, const void*, size_t);
typedef hash_val_t (*hash_fun_t)(const void *, size_t len);
typedef int (*data_construct_t)(void **);
typedef int (*data_destroy_t)(void *);

typedef struct zfs_hsnode_t zfs_hsnode_t;
typedef struct zfs_hashs_t zfs_hashs_t;

struct zfs_hsnode_t{
zfs_hsnode_t *next;
void *key;
size_t key_len;
void *data;
hash_val_t hkey;
};

struct zfs_hashs_t{
int is_dynamic;
zfs_hsnode_t **table;
hash_val_t nchains;
hash_val_t node_count;
hash_val_t max_count;
hash_val_t high_mark;
hash_val_t low_mark;
hash_val_t mask;
hash_val_t init_size;

/*callback functions*/
hash_comp_t key_comp;
hash_fun_t hkey_generator;
data_construct_t constructor;
data_destroy_t destroy;
};


另外,内存申请是通过malloc/free的
tp_linkcoco 2008-09-01
  • 打赏
  • 举报
回复
晚上有点事离开了,感谢大家的热情回复。

不能一下子全部申请,hash结构不好管理。

内存池在这种情况下怎么用?
冷月清晖 2008-09-01
  • 打赏
  • 举报
回复
内存池
sm_dlkey001 2008-09-01
  • 打赏
  • 举报
回复
建议搞一个内存池管理。。
星羽 2008-09-01
  • 打赏
  • 举报
回复
我装入6万个词条,需要大概6万次内存申请
---------

- -

为什么要声请那么多次,为什么不一次全部申请

或者考虑使用内存池
充电宝111 2008-09-01
  • 打赏
  • 举报
回复
char *s1 = "abc";
char *s2 = "def"

词条这么放不行么
星羽 2008-09-01
  • 打赏
  • 举报
回复
你是怎么管理内存的,直接用new delete吗?

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧