哈希表怎么保存到文件中呢?

时间:2022-09-30 22:56:43
我建立了一个哈希表,想把它存到文件中,然后再需要的时候直接读取出来整个哈希表,以便查找
用链表方式处理的冲突,以下是我的哈希表

typedef struct {
Term *tm; //数据元素存储基址,动态分配数组
int count; //当前数据元素个数
int sizeindex; //hashsize[sizeindex]为当前容量
}HashTable;


插入内容的部分就不写了,用链表方式处理的冲突

大家帮帮忙,如何能保存这个哈希表到文件里呢?怎么能从文件里整个直接读取出来整个哈希表到内存中呢?
谢谢大家了~~

15 个解决方案

#1


楼主也许换个思路会更好……
将数据写入文件,而不是将哈希表写入文件。
读取数据,并直接在内存生成哈希表更合算

#2


引用 1 楼 mstlq 的回复:
楼主也许换个思路会更好……
将数据写入文件,而不是将哈希表写入文件。
读取数据,并直接在内存生成哈希表更合算


我处理的是一个200多兆的txt文档,现在的做法就是读取数据,然后直接在内存中生成哈希表,但是这样处理一次要很长很长时间,所以,想把建好的哈希表存起来,用的时候读整个的哈希表,不知道这样做能不能行得通呢?谢谢了~

#3




不太清楚~~

#4


顶一下,大家帮帮忙,谢谢了~

#5


我也推荐存取数据,重新建表。

如果想避免插入操作直接拷贝整个链表,也只会比重新建表少了一步hash索引操作而已,其他的操作全都无法避免

,意义不大。。

#6


用fstream::write()方法写,用fstream::read()读取;
我建议文件用二进制流。
建议每个结构体写入文件时,采用这种方法。
先保存结构体的count值,然后将指针对应的数组数据写入文件。然后写sizeIndex。
读取时:
先读取出count,然后动态创建数组,将读取的数据一次填入动态创建的数组,然后把动态申请的地址赋值给结构的指针成员函数,然后读取sizeindex。

#7


大文件应该用结构化的方式存储到文件中,操作的时候直接映射到进程空间,然后直接操作内存,这样就不用每次解析文件内容了。

#8


可以给出个具体一些的代码框架吗?

#9


行不通。要不然提高解析文件和建立hashtable的速度,要不然使用现成的数据库。

#10


可以,用二进制流的方式,绝对可以

#11


引用 10 楼 hengshan 的回复:
可以,用二进制流的方式,绝对可以

能给一些参考的代码吗?

#12


用指针肯定是不行的 想办法转成用相对位移

#13


分到不同文件名中存储

#14


分到不同文件名的文件中存储

#15


如果你的文件有200M的话,那么用一步来创建hash的时间和读取文件的时间比,简直微乎其微,所以,直接用的时候及时的建hash也没什么问题

或者,你将建完的hash写入文件的时候,在每个字段之后写一个标志位,表明hash[i]的数据已经写完了,读的时候碰到标志位就i++就行了吧!!

#1


楼主也许换个思路会更好……
将数据写入文件,而不是将哈希表写入文件。
读取数据,并直接在内存生成哈希表更合算

#2


引用 1 楼 mstlq 的回复:
楼主也许换个思路会更好……
将数据写入文件,而不是将哈希表写入文件。
读取数据,并直接在内存生成哈希表更合算


我处理的是一个200多兆的txt文档,现在的做法就是读取数据,然后直接在内存中生成哈希表,但是这样处理一次要很长很长时间,所以,想把建好的哈希表存起来,用的时候读整个的哈希表,不知道这样做能不能行得通呢?谢谢了~

#3




不太清楚~~

#4


顶一下,大家帮帮忙,谢谢了~

#5


我也推荐存取数据,重新建表。

如果想避免插入操作直接拷贝整个链表,也只会比重新建表少了一步hash索引操作而已,其他的操作全都无法避免

,意义不大。。

#6


用fstream::write()方法写,用fstream::read()读取;
我建议文件用二进制流。
建议每个结构体写入文件时,采用这种方法。
先保存结构体的count值,然后将指针对应的数组数据写入文件。然后写sizeIndex。
读取时:
先读取出count,然后动态创建数组,将读取的数据一次填入动态创建的数组,然后把动态申请的地址赋值给结构的指针成员函数,然后读取sizeindex。

#7


大文件应该用结构化的方式存储到文件中,操作的时候直接映射到进程空间,然后直接操作内存,这样就不用每次解析文件内容了。

#8


可以给出个具体一些的代码框架吗?

#9


行不通。要不然提高解析文件和建立hashtable的速度,要不然使用现成的数据库。

#10


可以,用二进制流的方式,绝对可以

#11


引用 10 楼 hengshan 的回复:
可以,用二进制流的方式,绝对可以

能给一些参考的代码吗?

#12


用指针肯定是不行的 想办法转成用相对位移

#13


分到不同文件名中存储

#14


分到不同文件名的文件中存储

#15


如果你的文件有200M的话,那么用一步来创建hash的时间和读取文件的时间比,简直微乎其微,所以,直接用的时候及时的建hash也没什么问题

或者,你将建完的hash写入文件的时候,在每个字段之后写一个标志位,表明hash[i]的数据已经写完了,读的时候碰到标志位就i++就行了吧!!