本文介绍了在OSX上的Java文件的限制比在bash低的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我增加了最大文件限制对我的MacBook Pro,这样Elasticsearch可以与多个文件的工作,但它不工作。
我运行命令'的ulimit -a,它说打开文件为10万。我可以运行一个简单的shell脚本是这样的:
出口计数器= 0
而(真);做触摸的/ tmp / foo的$ {}柜台;出口计数器=`$ expr的柜台+ 1`; DONE
和我能够创造大量的文件(超过60,000之前,我杀了脚本)。
不过,使用Java code创建中的/ tmp目录目录的空白子目录RandomAccessFiles,我只能让10232文件之前,我得到的错误:java.io.FileNotFoundException(打开的文件太多)。这里是我的Java code:
进口java.io. *;
进口的java.util。*;公共类max_open_files {
公共静态无效的主要(字符串参数... args)抛出异常{
文件TESTDIR =新的文件(/ tmp目录/ tempsubdir);
testDir.mkdirs(); 清单<文件>文件=新的LinkedList<文件>();
清单<&的RandomAccessFile GT;文件句柄=新的LinkedList<&的RandomAccessFile GT;(); 尝试{
而(真){
文件f =新的文件(TESTDIRTMP+ fileHandles.size());
RandomAccessFile的RAF =新RandomAccessFile的(F,RW);
files.add(F);
fileHandles.add(RAF);
}
}赶上(例外前){
的System.out.println(ex.getClass()++ ex.getMessage());
} 对于(RAF的RandomAccessFile:文件句柄)raf.close() 对于(F文件:文件)f.delete(); 的System.out.println(最大打开文件:+ fileHandles.size());
}
}
这java的code是类似于Elasticsearch的code,测试上的文件数量的限制(在MAXOPENFILES方法FileSystemUtils类)。所以Elasticsearch有我的Java程序有同样的问题。
在shell脚本为什么可以比Java code(我和Elasticsearch的)那么多的文件?为什么上的文件的数量高系统的限制没有得到由Java code识别?
更新5月13日下午4:50 CDT:我创建的测试程序的C版本,看看是否限为Java的具体,这似乎是如此。下面的C版本可以打开的文件32765,而在Java code被限制在10232的文件。
的#include<&stdio.h中GT;
#包括LT&;&stdlib.h中GT;INT主(INT ARGC,为const char * argv的){
字符名称[100];
FILE * FP;
INT NDX; 对于(NDX = 0;&NDX LT; 50000; NDX ++){
sprintf的(名字,/tmp/foo%d.txt,NDX);
FP = FOPEN(姓名,W);
如果(FP == NULL){
fprintf中(标准输出,无法创建文件%d个\\ N,NDX);
返回1;
}
fprintf中(FP,你好%D,NDX);
} 返回0;
}
解决方案
为Mac Java虚拟机选项参考
这篇关于在OSX上的Java文件的限制比在bash低的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!