lucene: IO/FileNotFoundException:(Too many open files) 查询异常解决
2024-08-29 07:21:04
http://stackoverflow.com/questions/6210348/too-many-open-files-error-on-lucene
今天使用lucene的IndexSearcher报这种异常,文件句柄数超多,超过了设置的65535个
问题解决后发现是IndexSearcher.close()并没有真正的关闭,看来这篇文章后知道的
看了看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();
}
}
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();
IndexReader indexReader = IndexReader.open(dir, true);
dir.close();
把目录关闭后,打开的索引文件句柄才是真正的关闭了,真正解决了这个问题
有这方面的问题解决,答案确实是关闭reader和directory,调用close方法
如果使用了reader的reopen方法,会返回一个新的reader,如果这个reader是最新的,跟你保存你的已实例化好的reader不同的话,建议用新reader并且把旧reader关闭,释放资源(打开文件句柄),用reopen可以提高性能,减少实例化一个新的reader需要的I/O
IndexReader.reopen(true);
reopen实战代码:
/*
* 先获取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());
}
* 先获取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:
if (!indexReader.isCurrent()) {
try {
// Directory directory = indexReader.directory();
// directory.close();
// directory = null;
indexReader.close();
// indexReader = null;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
IndexReader newIndexReader = indexReader.reopen(true);
map.put("IndexReader", newIndexReader);
// if (newIndexReader != indexReader) {
// map.put("IndexReader", newIndexReader);
// } else {
// map.put("IndexReader", indexReader);
// }
}
有关reader的reopen方法详细的介绍
最新文章
- AutoMapper(二)
- ASP.NET MVC 设置Area中 Controller 的方法 默认启动页
- SqlServer2008R2附件数据库失败
- UIDatePicker的时间选择器里的时区的问题
- Android市场官方的统计信息
- 理解JavaScript原型式继承
- VLD(Visual LeakDetector)内存泄露库的使用
- 最近点对问题 HDU Quoit Design 1007 分治法
- dojo/request
- C#如何将Build成功的程序集Copy到上一层目录
- DirectShow音频采集声音不连续问题分析与解决办法经验总结
- CentOS 安装 clamav
- 各开放平台API接口通用SDK序列文章 前言
- Avio红外热像仪在汽车行业的应用
- Java多线程简介
- [Swift]LeetCode872. 叶子相似的树 | Leaf-Similar Trees
- [LeetCode] Max Increase to Keep City Skyline 保持城市天际线的最大增高
- vue实现购物车和地址选配
- MySQL、MongoDB、Redis 数据库之间的区别
- Collection articles on stackoverflow
热门文章
- Codeforces 801 A.Vicious Keyboard &; Jxnu Group Programming Ladder Tournament 2017江西师大新生赛 L1-2.叶神的字符串
- (11)python 模块和包
- Java中byte与(16进制)字符串的互相转换
- Retrying Operations using Spring's RetryTemplate
- 【构造】Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) D. Artsem and Saunders
- 使用history命令查看作业的整体执行情况
- iOS开发——使用Autolayout弹出键盘
- jvm-监控指令-jstack
- Word2010插入页码分节符
- vb6 wininet