IKAnalyzer词典占用内存大小分析
本文由发表于3年前 | J2EE | 暂无评论 |  被围观 4,240 views+
IKAnalyzer的存储结构:

这里还是使用搜狗的扩展词库

扩展词典添加搜狗词库:

http://pinyin.sogou.com/dict/cell.php?id=11640
词条 大小
392790个 13737KB

先直接用java.lang.Runtime类中的freeMemory(),totalMemory(),maxMemory ()这几个方法

进行计算。

先把这92790个放入到ext.dic文件中。

加上IKAnalyzer默认加载的这两个词典:

org/wltea/analyzer/dic/main2012.dic 275713个
org/wltea/analyzer/dic/quantifier.dic 316个

总格的词条是66W多。

执行如下代码:

public static void main(String[] args){
    calculateMem();
}
public static void calculateMem(){
    System.out.println("初始化内存");
    System.out.println("空闲内存:" + Runtime.getRuntime().freeMemory());
    System.out.println("已获取到的内存:" + Runtime.getRuntime().totalMemory());
    System.out.println("能够获得的最大内存:" +Runtime.getRuntime().maxMemory());
    System.gc();
    Dictionary.initial(DefaultConfig.getInstance());
    long total = Runtime.getRuntime().totalMemory(); // 返回总的内存数
    long size = Runtime.getRuntime().freeMemory(); // 返回当前的剩余内存数
    System.out.println("Memory used: " + (total - size));
}
执行结果如下:
初始化内存
空闲内存:15965080
已获取到的内存:16252928
能够获得的最大内存:518979584
加载扩展词典:ext.dic
加载扩展停止词典:stopword.dic
Memory used: 95027120B

结果是90.62M

接下来使用Instrumentation的getObjectSize方法进行计算下:

public class CalculateDictionarySize {
    public static void main(String[] args){
        Dictionary.initial(DefaultConfig.getInstance());
        System.out.print(SizeOfAgent.fullSizeOf(Dictionary.getSingleton()) + "B");
    }
}

编写MANIFEST.MF文件:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.1
Created-By: 1.5.0_06-b05 (Sun Microsystems Inc.)
Main-Class: com.itzhai.test.CalculateDictionarySize
Class-Path: lib/IKAnalyzer2012_u6.jar
Premain-Class: com.itzhai.test.SizeOfAgent
Boot-Class-Path:
Can-Redefine-Classes: false

包结构如下:

20140608-java01

SizeOfAgent的写法参考这里:

http://www.itzhai.com/java-object-memory-calculate-method.html

打包成Jar文件之后,到命令行中执行:

java -javaagent:sizeOfAgent.jar com.itzhai.test.CalculateDictionarySize

结果如下:

20140608-java02

73.48M

也就是说66W多个字条占用了73.48M的内存。

IKAnalyzer的存储结构:

IKAnalyzer是以字典树的方式把字典载入内存中的:

词典管理类为Dictionary,有三种词典:主词典,停用词词典,量词词典,这三种词典都是对应为一个DictSegment对象的,而DictSegment对象时树形结构的,每一个子节点又可以是一个DictSegment对象。

节点的存储方式:以数组(DictSegment[])或者Map(Map<Character, DictSegment)存储的,按照如下规则选择存储方式

  • 如果子节点数量小于等于ARRAY_LENGTH_LIMIT,则采用数组存储
  • 如果子节点数量大于ARRAY_LENGTH_LIMIT,则采用Map存储。
除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/ikanalyzer-dictionary-memory-size-calculate.html
arthinking Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2014 6/9
如果您有更好的原创技术博文或者观点,欢迎投稿:admin@itzhai.com,或者关注订阅左侧浮动面板的微信号订阅IT宅itread)发送消息。
文章评论
    没有评论
给我留言

有人回复时邮件通知我
J2EE的相关文章
随机文章 本月热门 热评
1 JVM笔记 – 自动内存管理机制(虚拟机性能监控与故障处理工具) 2014/11/26
2 配置Maven项目自动编译 2014/12/9
3 hibernateTemplate.executeFind(new HibernateCallback())出现NullPointerException空指针的解决方法 2011/9/21
4 ExtJS的FileUploadField组件上传多个文件 2011/5/8
5 C语言语法笔记 – 指针与数组 一维数组 二维数组 字符数组 二维字符串 指针与一维数组 2011/8/30
6 文件管理-外存分配方式 目录管理 存储空间管理 2011/6/30
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
猜您喜欢
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.