2011-09-15 12 views
5

मुझे स्टार्टअप पर कई हजार छोटी फ़ाइलों की सामग्री को पढ़ने की आवश्यकता है। लिनक्स पर, केवल फॉपेन और रीडिंग का उपयोग करना बहुत तेज़ है। विंडोज़ पर, यह बहुत धीरे-धीरे होता है।CreateFile को जितनी जल्दी हो सके

मैंने ReadFileEx का उपयोग करके ओवरलैप्ड I/O (असिंक्रोनस I/O) का उपयोग करने के लिए स्विच किया है, जहां डेटा पढ़ने के लिए तैयार होने पर विंडोज कॉलबैक करता है।

हालांकि, CreateFile के लिए वास्तविक हजारों कॉल अभी भी एक बाधा हैं। ध्यान दें कि मैं अपने स्वयं के बफर की आपूर्ति करता हूं, NO_BUFFERING ध्वज चालू करता हूं, सीरियल संकेत देता हूं, आदि। हालांकि, CreateFile के कॉल कई 10 सेकंड लेते हैं, जबकि लिनक्स पर सबकुछ बहुत तेज होता है।

क्या इन फ़ाइलों को और अधिक तेज़ी से पढ़ने के लिए तैयार करने के लिए कुछ भी किया जा सकता है?

CreateFile करने के लिए कॉल है:

  hFile = CreateFile(szFullFileName, 
       GENERIC_READ, 
       FILE_SHARE_READ | FILE_SHARE_WRITE, 
       NULL, 
       OPEN_EXISTING, 
       FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING | FILE_FLAG_SEQUENTIAL_SCAN, 
       NULL); 
+1

यह संभव है कि बाधा फाइल सिस्टम है, क्या हजारों छोटी फ़ाइलों को पढ़ने के बजाय एक फ्लैट फ़ाइल का उपयोग करना संभव है? – tenfour

+0

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

+1

आपको इस प्रश्न पर एक नज़र रखना चाहिए http://stackoverflow.com/questions/197162/ntfs-performance-and-large-volumes-of-files-and- निर्देशिकाएं –

उत्तर

9

CreateFilekernel32.dll में ntdll.dll में गिरी syscall NtCreateFile की तुलना में कुछ अतिरिक्त भूमि के ऊपर है। यह वास्तविक कार्य है कि CreateFile कर्नेल को फ़ाइल खोलने के लिए कहने के लिए कॉल करता है। यदि आपको बड़ी संख्या में फाइलें खोलने की ज़रूरत है, तो NtOpenFile Win32 के विशेष मामलों और पथ अनुवाद से बचकर अधिक कुशल होगा - ऐसी चीजें जो किसी भी निर्देशिका में फ़ाइलों के समूह पर लागू नहीं होंगी।

NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT HANDLE *FileHandle, IN ACCESS_MASK DesiredAccess, IN OBJECT_ATTRIBUTES *ObjectAttributes, OUT IO_STATUS_BLOCK *IoStatusBlock, IN ULONG ShareAccess, IN ULONG OpenOptions); 

HANDLE Handle; 
OBJECT_ATTRIBUTES Oa = {0}; 
UNICODE_STRING Name_U; 
IO_STATUS_BLOCK IoSb; 

RtlInitUnicodeString(&Name_U, Name); 

Oa.Length = sizeof Oa; 
Oa.ObjectName = &Name_U; 
Oa.Attributes = CaseInsensitive ? OBJ_CASE_INSENSITIVE : 0; 
Oa.RootDirectory = ParentDirectoryHandle; 

Status = NtOpenFile(&Handle, FILE_READ_DATA, &Oa, &IoSb, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_SEQUENTIAL_ONLY); 

मुख्य नकारात्मक: यह API उपयोगकर्ता मोड में उपयोग के लिए माइक्रोसॉफ्ट द्वारा समर्थित नहीं है। जिसके अनुसार, बराबर समारोह is documented for kernel mode use और 1993

NtOpenFile में Windows NT की पहली रिलीज के बाद से नहीं बदला है भी आप एक मौजूदा निर्देशिका हैंडल (उदाहरण में ParentDirectoryHandle) जो नीचे कटौती करनी चाहिए करने के लिए फ़ाइल रिश्तेदार को खोलने के लिए अनुमति देता है निर्देशिका का पता लगाने में कुछ फाइल सिस्टम ओवरहेड पर।

अंत में, एनटीएफएस बड़ी संख्या में फाइलों के साथ निर्देशिकाओं को संभालने में बहुत धीमी हो सकती है क्योंकि केरी ग्रेगरी ने कहा।

+0

एनटीएफएस के बारे में बयान "धीमा" नहीं है और न ही एनटीक्रेटफाइल के बारे में कोई भी CreateFile सत्य से तेज़ है - दोनों पूरी तरह से तैयार किए गए हैं।जब तक कि कोई इसके लिए कुछ सबूत पोस्ट नहीं करता है, मुझे बुलशिट को कॉल करना होगा - कुछ सीपीयू-चक्रों को छोड़कर दोनों कार्य रात-समान व्यवहार करेंगे और एनटीएफएस एक मामूली तेज़ फाइल सिस्टम है। – specializt

+0

देखें http://stackoverflow.com/questions/197162/ntfs-performance-and-large-volumes-of-files-and- निर्देशिकाएं –

+0

हाँ ... ... इसका कोई सबूत नहीं है। कोई आकड़ा उपलब्ध नहीं है। – specializt

0

फ़ाइल बनाने के पहले कुशलतापूर्वक एमएफटी में पेजिंग का प्रयास करें। यह FSCTL_ENUM_USN_DATA जारी करके किया जा सकता है।

संबंधित मुद्दे

 संबंधित मुद्दे