你好,游客 登录 注册 搜索
背景:
阅读新闻

Java codebase的Hadoop应用中使用Darts

[日期:2012-12-20] 来源:Linux社区  作者:xceman1997 [字体: ]

背景

Darts是双数组的c++ (template)实现,用来存储、查询大规模词表非常方便。缺点是只能够使用“字符串完全匹配”,而不能查询“某个字符串是否是另外一个字符串的字串”这样的需求。

如下原因结合起来,促使要在java codebase中使用Darts:

1. 词表规模巨大,存储、查询效率很低

2. Darts是c++实现,现有Hadoop codebase是java的,无法直接使用

技术思路:

1. 用c++进一步包装Darts接口(这一步必须要做,因为darts实现在.h中——template+inline牛B,默认使用方式是在c++project中直接包含头文件就能调用相关接口),并生成动态链接库

2. 用JNI(java native interface)进一步包装动态库,形成java接口

3. 在现有codebase中调用JNI

使用方法

这部分讲如何使用已经包装好的Darts。具体Darts是如何包装的,后面再详细说。

Darts JNI接口

接口定义在Darts.java文件中:

public class Darts {
 public static native boolean BuildDict (String fileInput, String fileDictOutput);
 public static native boolean LoadDict (String fileDict);
 public static native boolean IsInDict (String term);
 
 static
 {
  System.loadLibrary("Darts");
 }
 
 
 public static void main(String[] args) throws Exception {

  System.out.println ("In this project, we test jni!\n");
 
  ……
 
 } // main
}

三个接口,分别创建词典、加载词典和判断某个字符串是否在词典中。

创建Darts词典

1.将词典放到文本文件中,以UTF-8保存,在windows平台,UE中可以选择“UTF-8-无BOM”

2.在java中调用BuildDict函数,输入参数为步骤1中的文本文件,输出为Darts格式的词典文件,例如:在Darts.java的main函数中作如下调用:

Darts.BuildDict("/xxx/xxx_utf8.txt", "/xxx/xxx_utf8.dict");

3.运行上述调用程序,生成词典文件

如果在windows + eclipse上直接运行,会提示找不到动态库Darts,是在这里调用的:

static
 {
  System.loadLibrary("Darts");
 }

实际上是找不到libDarts.so文件。而且在windows环境下,.so文件也无法正常加载。解决方法是打成jar包,放到linux环境下,用‘-Djava.library.path’选项来指明.so文件所在的路径,例如:

java-Djava.library.path='/xxx/MyDarts'-jar /xxx/tmp/DartsForJni.jar myDarts

我编译的libDarts.so文件在'/xxx/MyDarts'路径下。

linux
相关资讯       Hadoop应用  Java Hadoop  Darts 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款