続・一つのプロセスが開けるファイルの数(やっぱり分からず)
こんなページを見つけた。
http://www.beasys.co.jp/cs/support_news/product_troubleshooting/Too_Many_Open_Files_Pattern.html
Windows2000 Proでは、16384が上限らしいとの情報を得てみた。
これがプロセスごとなのか、全体なのかは不明。
で、ファイルハンドルっていうのがWindows流の呼び方だっていうのが分かったので、それをキーワードに再検索してみたところ、こんなページも発見。
http://support.microsoft.com/kb/436631/ja
こちらは、プロセス当たりと明記されており、ハンドル数の上限は16,581,375なのだそうだ。
ところで僕が使っているWindowsXP Proについての記述は見当たらない。
で、色々探しているうちに、TweakUI@Power Toysとか懐かしいツールが出てきて、さらにtuneappなるツールもあることが判明。
- Microsoft PowerToys for Windows XP: http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx
- Power Toys for XPの日本語化(僕は試してません): http://stereo.jpn.org/muttyan/ptoyxp.htm
- tuneapp: http://factory.sakura.ne.jp/tuneapp/
tuneappによれば、各プロセスが使用できる最大数はデフォルト10,000とのことです。
じゃあっていうんで、さっきのJavaプログラムをメモリ不足にならないよう、「-Xmx128m」オプションを付けて実行するも、結果が倍になっただけ。(15656)
もしかして、同じファイルを開き続けると何かの最適化が効いてしまっているのか?と思い、別々のファイルを開くようプログラムを改造。(ちなみにファイルはdirディレクトリ配下に1〜10001まで作成)
import java.io.*; import java.util.*; public class openloop2 { public static void main(String[] args) throws Exception { List frlist = new ArrayList(); int i = 1; while(true) { FileReader fr = new FileReader("dir/" + i); frlist.add(fr); System.out.println("file opened " + i); i += 1; } } }
が、結果惨敗でした。。
... file opened 10000 file opened 10001 Exception in thread "main" java.io.FileNotFoundException: dir\10002 (指定された ファイルが見つかりません。) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileReader.<init>(Unknown Source) at openloop2.main(openloop2.java:12) >
どうしたもんか。。
ちなみにですが、ファイルを作るプログラム
Set fs = CreateObject("Scripting.FileSystemObject") For i = 1 to 10001 Set ts = fs.CreateTextFile("dir\\" & i) ts.WriteLine i & "" ts.Close() Next
こんなときはVBScript便利。