##language:zh #pragma section-numbers off ##含有章节索引导航的 ZPyUG 文章通用模板 <> ## 默许导航,请保留 <> = 关于jpype/lucene 的痛苦 = ##startInc {{{ ghostwwl reply-to python-cn@googlegroups.com to python-cn`CPyUG`华蟒用户组 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的手册 1. 千万不要在调用jpype的时候在python里使用那个关闭jvm的那个函数 让python运行完自己关闭jvm 不然 。。。 我发现死在那里动不了 呵呵 == 依然存在的问题: == * 现在没有解决的问题就是 怎么在python使用jpype的时候 手动对java虚拟机里的资源 回收?! * 都知道java的gc要到空闲的时候才资源回收 不然如果长时间跑 特别大量数据 交互 频繁创建对象 你会发现 java虚拟机的堆内存永远是不够用的 这个还没解决 有知道的pythoner告诉偶一声 ##endInc ---- '''反馈''' 创建 by -- ZoomQuiet [<>]