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();
     }
}
 
 

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

 
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方法
 
如果使用了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());
    }
 
 
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方法详细的介绍
 
 

lucene: IO/FileNotFoundException:(Too many open files) 查询异常解决的更多相关文章

  1. java.io.FileNotFoundException: ***(Too many open files)

    http://yizhilong28.iteye.com/blog/1154098 在linux下跑一个多线程读取文件的程序,待读取文件有数十万个.程序读取过程中抛出如下异常*****(Too man ...

  2. lucene: nDocs must be > 0查询异常解决

    nDocs must be > 0     // 函数search(query,filter,n),其中query是查询条件,filter是过滤器,n查询数量,异常消息意思就是n参数的值必须大于 ...

  3. “System.IO.FileNotFoundException”类型的未经处理的异常在 mscorlib.dll 中发生

    这个错误是我在打包的时候.发现的,由于我移动了我的project的位置(从C盘移动到了D盘),看一下出错的代码: Dim strDB As String = System.Configuration. ...

  4. 报错:java.io.FileNotFoundException: (系统找不到指定的路径。)

    报错如下: java.io.FileNotFoundException: E:\apache-tomcat-8.0.37\webapps\20161028-FileUpLoad\WEB-INF\fil ...

  5. nested exception is java.io.FileNotFoundException: class path resource [spring/spring-datasource-mog

    spring单元測试时发现的问题: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsin ...

  6. Caused by: java.io.FileNotFoundException

    1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...

  7. cloudera-scm-server启动时出现Caused by: java.io.FileNotFoundException: /var/lib/cloudera-scm-server/.keystore (No such file or directory)问题解决方法(图文详解)

    不多说,直接上干货! 问题详情 查看/var/log/cloudera-scm-server.log的启动日志 问题来源 我在用cloudermanager安装好之后,然后,在对如下. 配置kerbe ...

  8. SpringBoot 上传文件到linux服务器 异常java.io.FileNotFoundException: /tmp/tomcat.50898……解决方案

    SpringBoot 上传文件到linux服务器报错java.io.FileNotFoundException: /tmp/tomcat.50898-- 报错原因: 解决方法 java.io.IOEx ...

  9. 服务 在初始化安装时发生异常:System.IO.FileNotFoundException: "file:///D:\testService"未能加载文件或程序集。系统找不到指定文件。

    @echo.@if exist "%windir%\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" goto INSTALL ...

随机推荐

  1. HDU 2521 反素数(数论,比较)

    #include<iostream> #include<cstring> #include<cmath> #include<cstdio> using ...

  2. vijos P1190繁忙的都市(Kruskal)(最小生成树)

    P1190  繁忙的都市 城市C是一个非常繁忙的大都市,城市 中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉 ...

  3. CentOS 7安装tensorflow 1.6

    pip3 install tensorflow-gpu==1.6 1.6 依赖于cuda 9.0 cuDNN 7,并且前提需要下载和安装nvidia驱动. 安装驱动 nvidia 驱动地址: http ...

  4. Jenkins获取分支的插件

    Jenkins--->xxxx--->配置--->参数化构建过程--->选择Git Parameter Plug-In插件 Name: git_branch Descripti ...

  5. 9Andrew.S.Tanenbaum计算机网络第三版读书笔记-总体概览

  6. 【二分答案】bzoj1639 [Usaco2007 Mar]Monthly Expense 月度开支

    #include<cstdio> using namespace std; #define N 100001 int n,m,a[N]; bool check(int x) { int n ...

  7. 解决VM虚拟机中的ubuntu不能全屏的问题

    Ctrl+alt+T:打开终端 输入命令:sudo apt install open-vm* 运行之后重启一下虚拟机就可以了

  8. Exercise03_02

    import java.util.Scanner; public class AdditionQuiz { public static void main(String[] args){ int nu ...

  9. 原始DAO开发

    1,pojo package com.songyan.dao; import com.songyan.pojo.Student; public interface StudentDao { publi ...

  10. NDK之HelloWord!

    使用工具:Android Studio 2.2.2 1. 配置local.properties添加NDK路径.    效果:当然,你也可以手输写进去. 2. 项目gradle.properties追加 ...