मैं क्रियान्वित किया है (जावा में) एक पुनरावर्ती निर्देशिका संरचना में फ़ाइलों के नाम वापस जाने के लिए एक काफी सरल इटरेटर, और 2300 फ़ाइलों के बाद यह असफल लिस्टिंग जबकि "सिस्टम में बहुत सारी खुली फाइलें" (विफलता वास्तव में कक्षा को लोड करने की कोशिश में थी, लेकिन मुझे लगता है कि निर्देशिका सूची अपराधी थी)।विफलता "प्रणाली में बहुत अधिक फ़ाइलें खुली" एक पुनरावर्ती निर्देशिका संरचना
डेटा संरचना इटरेटर द्वारा बनाए रखा एक ढेर निर्देशिका जो प्रत्येक स्तर पर खुले हैं की सामग्री को पकड़े है।
वास्तविक तर्क काफी बुनियादी है:
private static class DirectoryIterator implements Iterator<String> {
private Stack<File[]> directories;
private FilenameFilter filter;
private Stack<Integer> positions = new Stack<Integer>();
private boolean recurse;
private String next = null;
public DirectoryIterator(Stack<File[]> directories, boolean recurse, FilenameFilter filter) {
this.directories = directories;
this.recurse = recurse;
this.filter = filter;
positions.push(0);
advance();
}
public boolean hasNext() {
return next != null;
}
public String next() {
String s = next;
advance();
return s;
}
public void remove() {
throw new UnsupportedOperationException();
}
private void advance() {
if (directories.isEmpty()) {
next = null;
} else {
File[] files = directories.peek();
while (positions.peek() >= files.length) {
directories.pop();
positions.pop();
if (directories.isEmpty()) {
next = null;
return;
}
files = directories.peek();
}
File nextFile = files[positions.peek()];
if (nextFile.isDirectory()) {
int p = positions.pop() + 1;
positions.push(p);
if (recurse) {
directories.push(nextFile.listFiles(filter));
positions.push(0);
advance();
} else {
advance();
}
} else {
next = nextFile.toURI().toString();
count++;
if (count % 100 == 0) {
System.err.println(count + " " + next);
}
int p = positions.pop() + 1;
positions.push(p);
}
}
}
}
मैं समझने के लिए इस कितने "खुली फ़ाइलों की आवश्यकता है" चाहते हैं। इस परिस्थिति में यह एल्गोरिदम एक फ़ाइल "खोलने" है, और यह फिर से बंद हो जाता है?
मैं कुछ साफ कोड जावा 7 या जावा 8 का उपयोग कर देखा है, लेकिन मैं जावा 6.
बस 1,000,000 से अधिक फाइलों के साथ एक फाइल सिस्टम पर अपने कोड भाग गया, और समस्या आप देख रहे हैं नहीं मिलता है। मैं विंडोज़ पर जेडीके 1.6.0_34 का उपयोग कर रहा हूं। शायद समस्या कोड में कहीं और है? क्या आप 'FilenameFilter' के लिए कोड पोस्ट कर रहे हैं जिसका उपयोग आप कर रहे हैं? यह एक समस्या हो सकती है। – msandiford
यह हो सकता है कि आपकी फाइल सिस्टम गहरी नहीं है, इसलिए जीसी द्वारा संसाधनों को ओएस में वापस कर दिया जा रहा है। या हो सकता है कि आपके ओएस की खुली फाइलों पर बड़ी सीमा हो। –
हां, मैं कल रात जाग रहा था कि फ़ाइल नामफिल्टर को दोषी ठहराया गया था या नहीं। लेकिन नहीं: स्वीकृति() विधि 'नई फ़ाइल (डीआईआर, नाम) .isDirectory() || लौटाती है pattern.matcher (name) .matches(); ' –