• 发布一个mmap的trie_midrmm02_新浪博客


    发布一个mmap的trie_midrmm02_新浪博客

        发布一个mmap的trie
        (2012-04-13 03:09:22)
        转载▼
        标签:
        杂谈
           
        发布一个mmap的trie 本帖最后由 redor 于 2010-04-13 17:24 编辑

        http://libibase.googlecode.com/svn/trunk/devel/utils/mmtrie.h
        http://libibase.googlecode.com/svn/trunk/devel/utils/mmtrie.c
        附件版本有问题,直接下这个吧 http://libibase.googlecode.com/files/mmtrie.zip
        写这个的出发点是吧之前做的trie能写到文件而且能很容易mmap到内存, 可以用于输入法 搜索引擎分词 词表的功能, 共享前缀存储, 支持最大20亿节点.
        简单一点可以当一个hash表使用, 查找的时间复杂度为 N* Log(256) N为字符长度, key可以为二进制的数据, value 必须为int类型, 不能为0, 因为mmtrie_get()/find() 没有结果的情况下为0,
        如果需要set value为0的话自己+1, 出来的时候-1就好了.
        大概数据结构和使用方法如下:


        typedef struct _MMTRIE
        {
        MMTRSTATE *state;
        MMTRNODE *nodes;
        void *map;
        off_t file_size;
        int fd;
        void *mutex;

        int(*add)(struct _MMTRIE *, char *key, int nkey, int data);
        int(*get)(struct _MMTRIE *, char *key, int nkey);
        int(*find)(struct _MMTRIE *, char *key, int nkey, int *len);
        int(*maxfind)(struct _MMTRIE *, char *key, int nkey, int *len);
        int(*radd)(struct _MMTRIE *, char *key, int nkey, int data);
        int(*rget)(struct _MMTRIE *, char *key, int nkey);
        int(*rfind)(struct _MMTRIE *, char *key, int nkey, int *len);
        int(*rmaxfind)(struct _MMTRIE *, char *key, int nkey, int *len);
        void (*clean)(struct _MMTRIE *);
        }MMTRIE;

        MMTRIE *mmtrie_init(char *file);

        int mmtrie_add(struct _MMTRIE *, char *key, int nkey, int data);

        int mmtrie_get(struct _MMTRIE *, char *key, int nkey);

        int mmtrie_find(struct _MMTRIE *, char *key, int nkey, int *len);

        int mmtrie_maxfind(st

        各位的c语言是怎样入门的呢?
        ruct _MMTRIE *, char *key, int nkey, int *len);

        int mmtrie_radd(struct _MMTRIE *, char *key, int nkey, int data);

        int mmtrie_rget(struct _MMTRIE *, char *key, int nkey);

        int mmtrie_rfind(struct _MMTRIE *, char *key, int nkey, int *len);

        int mmtrie_rmaxfind(struct _MMTRIE *, char *key, int nkey, int *len);

        voidmmtrie_clean(struct _MMTRIE *);

        //gcc -o mmtr mmtrie.c -D_DEBUG_MMTRIE && ./mmtr
        static char *mmfile = "/tmp/test.mmtrie";
        int main()
        {
        char word, *p = NULL;
        MMTRIE *mmtrie = NULL;
        int i = 0, n = 0, x = 0;

        if((mmtrie = mmtrie_init(mmfile)))
        {
        p = "abbbxxx"; mmtrie_add(mmtrie, p, strlen(p), 1);fprintf(stdout, "add(%s:%d)\r\n", p, 1);
        p = "abb"; mmtrie_add(mmtrie, p, strlen(p), 2);fprintf(stdout, "add(%s:%d)\r\n", p, 2);
        p = "abbx"; mmtrie_add(mmtrie, p, strlen(p), 3);fprintf(stdout, "add(%s:%d)\r\n", p, 3);
        p = "abbxddd"; mmtrie_add(mmtrie, p, strlen(p), 4);fprintf(stdout, "add(%s:%d)\r\n", p, 4);
        p = "abbxdddx"; mmtrie_add(mmtrie, p, strlen(p), 5);fprintf(stdout, "add(%s:%d)\r\n", p, 5);
        p = "abbx";x = mmtrie_get(mmtrie, p, strlen(p)); if(x http://www.dj1988.com!= 0)fprintf(stdout, "get(%s:%d)\r\n", p, x);
        p = "abbxddddd";x = mmtrie_find(mmtrie, p, strlen(p), &n); if(x != 0){fprintf(stdout, "find(%s => %.*s:%d)\r\n", p, n, p, x);}
        p = "abbxddddd";x = mmtrie_maxfind(mmtrie, p, strlen(p), &n); if(x != 0){fprintf(stdout, "maxfind(%s => %.*s:%d)\r\n", p, n, p, x);}
        //reverse
        p = "asscxxx"; mmtrie_radd(mmtrie, p, strlen(p), 1);fprintf(stdout, "radd(%s:%d)\r\n", p, 1);
        p = "adfdsfscxxx"; mmtrie_radd(mmtrie, p, strlen(p), 2);fprintf(stdout, "radd(%s:%d)\r\n", p, 2);
        p = "dafdsfscxxx"; mmtrie_radd(mmtrie, p, strlen(p), 3);fprintf(stdout, "radd(%s:%d)\r\n", p, 3);
        p = "aeffdsxccc"; mmtrie_radd(mmtrie, p, strlen(p), 4);fprintf(stdout, "radd(%s:%d)\r\n", p, 4);
        p = "adsssxxscxxx"; mmtrie_radd(mmtrie, p, strlen(p), 5);fprintf(stdout, "radd(%s:%d)\r\n", p, 5);
        p = "dafdsfssddcxxx";x = mmtrie_rget(mmtrie, p, strlen(p)); if(x != 0)fprintf(stdout, "rget(%s:%d)\r\n", p, x);
        p = "adsssxxscxxx";x = mmtrie_rfind(mmtrie, p, strlen(p), &n); if(x != 0){fprintf(stdout, "rfind(%s => %s:%d)\r\n", p, p+(strlen(p)-n), x);}
        p = "sadfsfsdadfdsfscxxx";x = mmtrie_rmaxfind(mmtrie, p, strlen(p), &n); if(x != 0){fprintf(stdout, "rmaxfind(%s => %s:%d)\r\n", p, p+(strlen(p)-n), x);}
        mmtrie->clean(mmtrie);
        }
        }
        [ 本帖最后由 redor 于 2010-1-27 11:55 编辑 ]楼主纯爷们儿原帖由 c/unix 于 2010-1-27 09:07 发表 http://bbs.chinaunix.net/images/common/back.gif
        楼主纯爷们儿


        谢谢啊! 这话现在怎么听都别扭.... 失去原味了支持LZ。不错http://www.jssxd.com/,支持楼主能给点注释就更完美了,让我们菜鸟也能学习学习,瞻仰瞻仰!哈哈..学习下。好强大 但是不太会用。。。出发点是不是想实现一个数据的存储,如果内存不够大,就利用mmap存到文件当中去。感觉不如直接用数据库快,比如sql-lite等,不过作为研究肯定是值得称赞的 本帖最后由 redor 于 2010-04-12 14:09 编辑

        回复 9# w_x_x


        mmap是有一个比较好的内存和文件的同步方案, 易于导入, 这个就是一个基于mmap的trie 跟sqllite根本不是一个东西...... 

        用于存储数据的还有一个在这里, http://libibase.googlecode.com/svn/trunk/devel/hibase/src/utils/db.c
  • 相关阅读:
    web测试知识点整理
    LINUX系统、磁盘与进程的相关命令
    压缩与解压
    LINUX基本操作命令
    linux命令管道工作原理与使用方法
    C#根据path文件地址进行下载
    C#向Word文档中的书签赋值
    网站发布
    乱码转换
    获取新增的数据ID
  • 原文地址:https://www.cnblogs.com/lexus/p/2931862.html
Copyright © 2020-2023  润新知