2009-12-15 5 views
5

के लिए यूनिक्स स्टेट()/lstat() मान लीजिए कि मैं lstat() सिस्टम कॉल द्वारा लौटाए गए फ़ाइल की कई संपत्तियों (मालिक, आकार, अनुमतियां, समय) प्राप्त करना चाहता हूं। जावा में ऐसा करने का एक तरीका है java.io.File ऑब्जेक्ट बनाना और लंबाई(), lastModified() इत्यादि जैसे कॉल करें।जावा

  1. इन कॉल में से हर एक एक स्टेट() कॉल से चलाता है, और मेरे प्रयोजनों के स्टेट के लिए() रों महंगा माना जाता है:: मैं पर समानांतर में फ़ाइलों के अरबों स्कैन करने के लिए कोशिश कर रहा हूँ मैं दोनों समस्याओं अब तक है सैकड़ों मेजबान, और (पहली अनुमान के लिए) इन फ़ाइलों तक पहुंचने का एकमात्र तरीका एनएफएस के माध्यम से होता है, अक्सर फाइलर क्लस्टर के खिलाफ जहां स्टेट() लोड के तहत आधे सेकेंड लग सकते हैं।

  2. कॉल lstat() नहीं है, यह आमतौर पर stat() (जो symlinks का पालन करता है) या fstat64() (जो फ़ाइल खोलता है और पहुंच समय रिकॉर्ड करने के लिए एक लेखन ऑपरेशन ट्रिगर कर सकता है)।

वहाँ एक "सही" तरीका यह है है, ऐसा है कि मैं अंत में बस() कॉल एक भी lstat कर रहे हैं और struct स्टेट के सदस्यों तक पहुँचने? क्या मैं Googling से अब तक पाया है:

  • JDK 7 सब कुछ मैं चाहता हूँ के साथ java.nio.file में PosixFileAttributes इंटरफेस होगा (लेकिन मैं नहीं बल्कि हर रात को नहीं चल होगी मेरी JDK के बनाता है अगर मैं कर सकते हैं इससे बचो)।

  • मैं जेएनआई या जेएनए के साथ अपना स्वयं का इंटरफ़ेस रोल कर सकता हूं (लेकिन अगर मैं कोई मौजूदा नहीं हूं तो मैं नहीं चाहता हूं)।

previous similar question ने जेएनआई/जेएनए कार्यान्वयन के कुछ सुझाव दिए। एक चला गया है और दूसरा संदिग्ध रूप से बनाए रखा गया है (उदाहरण के लिए, कोई डाउनलोड नहीं, केवल एक एचजी भंडार)।

क्या वहां कोई बेहतर विकल्प हैं?

उत्तर

2

ऐसा लगता है कि आपने सभी अड्डों को बहुत अधिक कवर किया है। जब मैंने आपका प्रश्न पढ़ना शुरू किया तो मेरा पहला विचार जेडीके 7 या जेएनआई था। इन फ़ाइलों पर परिवर्तन पैटर्न के बारे में कुछ भी जानने के बिना आप एक एम्बेडेड डीबी की तरह प्रश्न में जानकारी के लगातार प्रकार के कैश को भी देख सकते हैं। आप एनएफएस के अलावा कुछ अन्य एक्सेस विधि भी देख सकते हैं, जैसे एक कस्टम वेब सेवा जो रिमोट होस्ट से थोक फ़ाइल जानकारी प्रदान करती है।

+0

धन्यवाद! आखिरकार मुझे लगता है कि जेडीके 7 इतना बुरा नहीं है; मैं केवल उस टूल के साथ द्विआधारी रख सकता हूं जो मैं लिख रहा हूं, और यह जल्द ही उत्पादन-ग्रेड सॉफ्टवेयर होगा। –

1

हां, स्टेट() सभी कॉल और पुस्तकालयों के अंतर्गत है। यह एक विलंबता समस्या है। हालांकि, आप कई स्टेटस() एक बार में कर सकते हैं, क्योंकि आपके कनेक्शन का समर्थन करने के लिए कई एनएफएस सर्वर डिमन्स हैं, थ्रेड का उपयोग करते हुए जब तक कि किसी के पास एसिंक्रोनस स्टेट() उनकी आस्तीन नहीं है! यदि आप होस्ट पर जा सकते हैं, जैसे एसएसएच, स्टेट() बहुत सस्ता होगा। आप मार्गों में स्ट्रीम करने और stat() को स्ट्रीम करने के लिए एक टीसीपी सेवा भी लिख सकते हैं। दुर्भाग्यवश, एनएफएस सर्वर तक पहुंच मुश्किल या असंभव है, क्योंकि इसमें केवल व्यवस्थापक खाते हो सकते हैं, हिताची सैन या कुछ हो।

+0

एक छोटी ऐतिहासिक पृष्ठभूमि के लिए: प्रश्न में एनएफएस सर्वर 5-10 पीबी इस्इलॉन क्लस्टर थे, जिसने स्टेट कॉल पर सख्त स्थिरता प्रदान की लेकिन विवाद के तहत भयानक विलंबता की लागत पर। (मुझे अभी भी यकीन नहीं है कि उनके पास एक बड़ा ताला या कुछ अधिक परिष्कृत था।) यह एक फाइल सिस्टम-स्तर की समस्या थी: हमने रूट के रूप में बेहतर तरीके से नहीं किया था। हमने कंप्यूटर के कुछ दिनों को बचाने की कोशिश कर रहे लोगों के कुछ दिनों के बजाय बस अपना समय लेने के लिए इसे समाप्त कर दिया। –