关于jpype/lucene 的痛苦

ghostwwl <[email protected]>
reply-to        [email protected]
to      python-cn`CPyUG`华蟒用户组 <[email protected]>
date    Thu, Dec 11, 2008 at 21:56
subject [CPyUG:73571] 关于jpype\lucene\paoding

缘起

这个星期已经折腾这个好几天了

需求
在python使用lucene对爬虫的爬回来的数据包做索引 提供给搜索引擎组 引擎组使用的java 要控制爬虫回访数据的:
  • 增量索引
  • 索引的修改 添加 和删除

解决办法一

  • 公司开发环境win 如果使用linux就远程登陆 有的是centos 最开始 我的第一个版本使用的Gcj的 在centos下

良好 然后使用 jcc发现也没什么问题 安装过程中 出现最多的就是 修改makefile文件 如果你写过gcc 对make的语法 不是很陌 生 安装上应该不会有问题 多线程PyLucene.PythonThread 这个你就当做python的threading用 一般不会有问 题 为了对索引是pylucene的使用的内存控制 和减少磁盘的压力 我多线程的时候 多个线程公用一个基于内存的IndexWriter然后到 了一定量同步到 基于文件的writer

  • 这个方法很有效
  • 需要说明的是 lucene的api上说IndexWriter是线程安全的 确实是线程安全的

  • 但是 发现 如果自己在python里再加一个锁 保证同一时刻只有一个线程写 比不加锁效率 会高很多
  • 不知道java的锁 是咋搞的 这个是我我对单字段 磁盘文件索引 极限速度可以到 100万数据 5分钟左右 使用标准分词
结果需求又来了
搜索组要求使用庖丁解牛分词 然后我就很努力的 想把 庖丁的源代码包 和lucene的源代码包放在一起 用pylucene-src的 通过修改makefile 来达到安装好pylucene后 就有了paoding 我可耻尝试了 gcj 和jcc两个版本
  • 因为对java我是小白 最后还是可耻的失败了 1个多星期 天天堆着makefile和java 痛苦可想而知

解决办法二:

  • 本周二的时候 在偶们组长惊喜的发现jpype然后说这个可以直接使用jar包 他说不要看网上 资料很少 大部分骂他不稳定 他说他觉得应该是稳定的 这个更实用的人有关系 不稳定肯定是自己的使用有问题 不要怀疑 这个东西的稳定性 可耻的 鄙视自己一把 我一直就怀疑 后来证明 这个是很稳定的 确实跟代码 和使用有关系
  • 然后让搜索组的 兄弟姐妹 弄来lucene和paoding的jar 昨天我不知道怎么同时使用2个jar 问了木头兄 今天 可耻的

发现 只要分好 跟多个jar 再次鄙视自己问这么低级的问题

  • 到下午的时候 把以前使用pylucene的代码 使用jpype重构 嗯 终于可以索引了 效率 比直接用pylucene低

速度只有那个的1/2不到 当然我同样多线程 这个时候又碰到一个恶心的问题 java的虚拟机报出 内存问题 堆内存不够用了 然后问问了zq 哎。。。。

  • 又是一个低级的问题 没办法 老大告我们 碰到问题的时候 去查资料 不如问别人来的快 省时间 要知道 我还正写代码在, 后

来 没办法google找到解决办法

  • 庖丁使用一路下来 折磨不少 特别那个配置加载 和词库加载 感谢偶们搜索组的java同胞 帮助 没有他们 还用不是庖丁

小结:

  1. 网上说的所谓的jpype不稳定 这个是不对的 如果出现问题
    • 第一看看自己的代码
    • 第二 看你调用的java的代码
    • 第三看jpype的手册
  2. 千万不要在调用jpype的时候在python里使用那个关闭jvm的那个函数 让python运行完自己关闭jvm 不然 。。。 我发现死在那里动不了 呵呵

依然存在的问题:

  • 现在没有解决的问题就是 怎么在python使用jpype的时候 手动对java虚拟机里的资源 回收?!
  • 都知道java的gc要到空闲的时候才资源回收 不然如果长时间跑 特别大量数据 交互 频繁创建对象 你会发现 java虚拟机的堆内存永远是不够用的 这个还没解决 有知道的pythoner告诉偶一声


反馈

创建 by -- ZoomQuiet [2008-12-11 14:21:44]

Name Password4deL ;) :( X-( B-)

PageCommentData