您的位置:首页 > 运维架构

lucene: IO/FileNotFoundException:(Too many open files) 查询异常解决

2014-11-07 10:36 591 查看
http://stackoverflow.com/questions/6210348/too-many-open-files-error-on-lucene



baidu zone - 为什么Lucene程序会报IOException:“Too many open files(打开了太多的文件)”?

今天使用lucene的IndexSearcher报这种异常,文件句柄数超多,超过了设置的65535个



问题解决后发现是IndexSearcher.close()并没有真正的关闭,看来这篇文章后知道的

CSDN - Lucene中IndexSearcher类的初始化

看了看IndexSearcher的close方法,让我汗颜了



这样写,才是真正的关闭IndexSearcher的reader,获取reader,最后关闭
IndexSearcher.getIndexReader().close()

更彻底的IndexSearcher关闭
if (null != indexSearcher) {

try {

IndexReader indexReader = indexSearcher.getIndexReader();

indexReader.close();

indexReader = null;

indexSearcher.close();

indexSearcher = null;

} catch (IOException e) {

e.printStackTrace();

}

}

以后出现这种问题首先仔细检查自己写的代码打开文件是不是没有正确关闭,程序的话就是这种错误,不是的话,就是系统的原因,加大文件句柄打开数量解决

IndexSearcherg关闭改进后,发现句柄数还是没有按照预想的使用完后就关闭的流程走,我觉得不只关闭IndexReader、IndexSearcher,看了CSDN - lucene使用教程4 --常用类的对象之IndexSearcher这篇文章后,可能实例化IndexReader的Directory也需要关闭,但我没试,等到了穷途末路的时候再去尝试吧

现在解决是加大文件打开句柄数,学dzh的机器,将我们的机器有原来设置的65535改为1006154
变通解决

搜索ulimit笔记,有记录设置文件打开数量的做法

原以为加大文件打开句柄数就能解决问题,但事实结果是没用,到了穷途末路的时候了,尝试关闭目录
Directory dir = FSDirectory.open(indexDirFile);

IndexReader indexReader = IndexReader.open(dir, true);

dir.close();

把目录关闭后,打开的索引文件句柄才是真正的关闭了,真正解决了这个问题

有这方面的问题解决,答案确实是关闭reader和directory,调用close方法
stackoverflow - Too many open files Error on Lucene

如果使用了reader的reopen方法,会返回一个新的reader,如果这个reader是最新的,跟你保存你的已实例化好的reader不同的话,建议用新reader并且把旧reader关闭,释放资源(打开文件句柄),用reopen可以提高性能,减少实例化一个新的reader需要的I/O
IndexReader.reopen(true);

reopen实战代码:

来自:baidu zone - lucene 一些记录
/*
* 先获取reader,如果索引文件已经变化,关闭当前indexSearcher,然后以重新获取的indexReader
* 作为参数new一个新的indexSearcher实例
*/
IndexReader indexReader=indexSearcher.getIndexReader();//获取当前的indexReader
if(!indexReader.isCurrent()){//判断是否有索引更新

// 如果有索引更新,先关闭当前的indexSearcher
indexSearcher.close();
//利用indexReader.reopen()获取新的indexReader,并作为IndexSearcher的参数创建一个新的indexSearcher
indexSearcher=new IndexSearcher(indexReader.reopen());
}

self:
[align=left] if (!indexReader.isCurrent()) {[/align]
[align=left] try {[/align]
[align=left]// Directory directory = indexReader.directory();[/align]
[align=left]// directory.close();[/align]
[align=left]// directory = null;[/align]
[align=left] indexReader.close();[/align]
[align=left] // indexReader = null;[/align]
[align=left] } catch (Exception e) {[/align]
[align=left] // TODO Auto-generated catch block[/align]
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] IndexReader newIndexReader = indexReader.reopen(true);[/align]
[align=left] map.put("IndexReader", newIndexReader);[/align]
[align=left]// if (newIndexReader != indexReader) {[/align]
[align=left]// map.put("IndexReader", newIndexReader);[/align]
[align=left]// } else {[/align]
[align=left]// map.put("IndexReader", indexReader);[/align]
[align=left]// }[/align]
[align=left] }[/align]

有关reader的reopen方法详细的介绍
CSDN - lucene IndexReader reOpen 的彻底研究
ITeye - lucene管理IndexReader和IndexWriter的最佳实践
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐