2011-08-05 13 views
6

मैं अपना खुद का फ्लैट फ़ाइल डेटाबेस बनाना चाहता हूं। यहाँ कैसे मैं फ्लैट फ़ाइल डेटाबेसक्या System.IO.FileShare के लिए कोई सीमा है?

Dim fs As New System.IO.FileStream("C:\MyDb.txt", IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read) 
Dim sr As New System.IO.StreamReader(fs) 

वहाँ एक सीमा System.IO.FileShare.Read, System.IO.FileShare.Write और System.IO.FileShare.ReadWrite के उपयोग के लिए नेट द्वारा लगाए गए जब एक फ़ाइल के साथ काम है का उपयोग है?

मेरा मतलब है कि नेट सक्षम समवर्ती एक एकल फाइल का उपयोग करने की फ़ाइल धारा और धारा पाठक System.IO.FileShare.Read साथ वस्तुओं का उपयोग कर उपयोगकर्ताओं के हजारों समर्थन करने के लिए है?

+1

हाय, मैं अगर वहाँ एक सीमा अंतर्निहित खिड़कियों एपीआई जो सबसे अधिक संभावना नेट wraps के बारे में अधिक है उम्मीद करेंगे। .. –

+1

इन सभी I/O अनुरोधों द्वारा उपयोग की जाने वाली कर्नेल पूल मेमोरी से परे कोई सीमा नहीं है। आपके द्वारा लिखी गई फ़ाइल से हजारों ऐप्स पढ़ने के लिए, अच्छी तरह से साहसी है। सिंक्रनाइज़ करने का कोई तरीका नहीं है, ये ऐप्स टेक्स्ट की आंशिक रूप से लिखित रेखाएं पढ़ने जा रहे हैं। यही कारण है कि सर्वर मौजूद हैं, SQL सर्वर अत्यधिक पसंद है, एक टेक्स्ट फ़ाइल एक dbase नहीं है। –

+0

हंस: फ़ाइलों तक पहुंच सिंक्रनाइज़ करना यही कारण है कि फ़ाइल लॉकिंग का आविष्कार किया गया था। – Gabe

उत्तर

2

मुझे .NET/windows द्वारा लगाई गई सटीक सीमा नहीं पता है, इसलिए मैंने आपके लिए एक वास्तविक परीक्षण बनाया है। मैंने कुछ मिनटों के लिए निम्नलिखित टेस्ट कोड चलाया और मैंने पाया कि system.io.fileshare उपयोग की संख्या, यह अभी भी कार्यात्मक है, यानी आप अभी भी फ्लैट डेटाबेस फ़ाइल की सामग्री पढ़ सकते हैं।

यहाँ कोड (यह एक WinForm आवेदन, नेट 4) है:

Public Class Form1 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     Dim filepath As String = "c:\database.txt" 

     Dim filestream As System.IO.FileStream 

     Dim count As Int32 

     For count = 0 To System.Int32.MaxValue 
      filestream = New System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read) 
      AppendLog(count, filestream.ReadByte) 
     Next 
    End Sub 

    Private LogFilepath As String = "C:\LogInfo.txt" 
    Private Enter As String = Chr(13) & Chr(10) 
    Private Space As String = " " 

    Private Sub AppendLog(ByVal Sequence As Int32, ByVal info As Byte) 
     System.IO.File.AppendAllText(LogFilepath, Enter & Sequence & Space & CStr(info)) 
    End Sub 

End Class 
3

FileShare सदस्य का अर्थ है कि अन्य फाइलें फ़ाइल भी खोल सकती हैं। यह नहीं गारंटी देता है कि डेटा किसी भी तरह से सिंक्रनाइज़ किया जाएगा - इसका मतलब यह है कि जब आप इसे खोलते हैं तो उस प्रोग्राम से कई प्रोग्राम अब पढ़ सकते हैं (FileShare.Read)।

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

फ़ाइल पढ़ने वाले समवर्ती कार्यक्रमों की संख्या के लिए कोई अनुचित सीमाएं नहीं हैं।

4

यदि आप विवादित पहुंच के साथ फ़ाइल खोलने और अनुमतियों को साझा करने का प्रयास करते हैं तो यह काम नहीं करेगा। लेकिन यदि यह एक कस्टम डेटाबेस है, तो आपको एक से अधिक फ़ाइल हैंडल को क्यों खोलने की आवश्यकता होगी? आपके कस्टम डेटाबेस सॉफ़्टवेयर को खुले हैंडल प्रबंधित करना चाहिए (प्रति फ़ाइल 1 होना)। आपके विशिष्ट प्रश्न के लिए, कोई निर्धारित सीमा नहीं है, लेकिन फ़ाइल के बाद के खुलने के लिए अनुमतियों को साझा करने और साझा करने के नियमों का पालन करने की आवश्यकता है।

http://msdn.microsoft.com/en-us/library/aa363874%28v=vs.85%29.aspx

0

आप केवल एक ही FileStream फाइल करने के लिए लिखने के लिए है, और हमेशा की तरह ताला तंत्र का उपयोग करते हुए एक समय में एक धागा करने के लिए इसके उपयोग को सीमित करना चाहिए। डीबीएमएस सॉफ़्टवेयर के लिए सामान्य मॉडल लिखने के संचालन की एक समवर्ती कतार है और उनके पास एक थ्रेड थ्रेड है जो उन्हें फ़्लश करता है। ऐसे मामलों में जहां आपको लेखन पूरा करने के लिए लेखन ऑपरेशन के स्रोत की आवश्यकता होती है, आप एक एसिंक मॉडल (BeginWrite/EndWrite) का उपयोग कर सकते हैं।

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

हालांकि, आपको हमेशा लोड को कम करने के लिए स्मृति में "सबसे गर्म" डेटा का कैश रखना चाहिए। इसके बिना, आपकी डिस्क बस रखने के लिए पर्याप्त तेज़ नहीं होगी।

1

एकाधिक ऑब्जेक्ट्स एक फ़ाइल तक पहुंच सकते हैं, हालांकि डिस्क पर फ़ाइलों को सहेजा जाता है, प्रत्येक ऑब्जेक्ट/प्रक्रिया के लिए कैश बफर पढ़ता है और कैश फ़ाइल तक पहुंचने वाली ऑब्जेक्ट्स की संख्या के साथ गुणा करेगा। प्रदर्शन प्रति ऑब्जेक्ट कैश को बनाए रखने और कैश मेमोरी की कुल क्षमता को बनाए रखने के लिए आवश्यक बाइट्स की मात्रा पर निर्भर करता है।

यदि ऑपरेशन पढ़ने के दौरान फ़ाइल संशोधित की जाती है तो एसिंक्रोनस रीड का उपयोग किया जाना चाहिए। हालांकि यदि कोई फ़ाइल लॉक की गई फ़ाइल के साथ समाप्त हो जाती है या उस फ़ाइल को बंद कर देती है जिसमें बकाया ताले हैं, तो व्यवहार अपरिभाषित है।

मैं आवश्यकता होने पर स्ट्रीम ऑब्जेक्ट्स को स्पष्ट रूप से नष्ट करने की अनुशंसा करता हूं।

0

फ़ाइल खोलना आम तौर पर इसका मतलब है कि यह आपके द्वारा विशेष रूप से खोला गया है और कोई अन्य प्रक्रिया इसे एक्सेस नहीं कर सकती है, जब तक कि आप विंडोज़ को यह नहीं बताते कि आप इसे साझा करना चाहते हैं।

फ़ाइलशेयर सेट करना। रीड/राइट का मतलब है कि आप अन्य प्रक्रियाओं को फ़ाइल खोलने या लिखने का अधिकार देते हैं जब आप इसे खोलते हैं।

मैं पुन: स्थापित करता हूं: आप अन्य प्रक्रियाओं को अपनी फ़ाइल को पढ़ने और/या लिखने का अधिकार देते हैं। न कुछ ज्यादा, न कुछ कम।

के एक दरवाजे के रूप में फ़ाइल साझा बिट्स की कल्पना करते हैं:

  • कोई मतलब है, दरवाजा बंद कर दिया और बंद है।
  • पढ़ें इसका मतलब है, आप केवल एक ही रास्ता जा सकते हैं।
  • लिखें लिखें, आप केवल दूसरी तरफ जा सकते हैं।

तो, दरवाजे की सीमा क्या है?

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