2011-01-24 18 views
6

में एक टेक्स्ट फ़ाइल में लिखने का कुशल तरीका हमारे पास कुछ जानकारी है जो हमें लिखने की आवश्यकता है (लगभग 18   केबी) हमारे नेटवर्क ड्राइव में से एक पर संग्रहीत .txt फ़ाइल में। फाइल हर 15 मिनट में एक बार फिर से लिखी जाती है, लेकिन इसे कम से कम हर सेकेंड में पढ़ा जाता है। हम वर्तमान में फ़ाइल लिखने के लिए StreamWriter का उपयोग कर रहे हैं।वीबीएनईटी

फ़ाइल सर्वर एक दूरस्थ स्थान पर है और राउंड ट्रिप पिंग 1   एमएस से 15   एमएस से भिन्न होता है।

समस्या यह है कि कभी-कभी फ़ाइल में सामग्री लिखने में छह सेकंड लगते हैं, जो नेटवर्क की गति पर विचार करने के बाद भी निश्चित रूप से बहुत लंबा होता है।

इसलिए, मैं सोच रहा हूं कि प्रदर्शन में सुधार के लिए VB.NET का उपयोग कर फ़ाइल लिखने का कोई प्रभावी तरीका है या नहीं? जावा के पास बुफर्डऑटपुटस्ट्रीम नामक एक बहुत अच्छा टूल है, जो दुर्भाग्यवश वीबी.नेट में उपलब्ध नहीं है (या मुझे इसे नहीं मिला है)।

+1

स्ट्रीमवाइटर पहले से ही buffered है। –

+0

बस एक विचार। यदि आप इसे अक्सर पढ़ रहे हैं, तो संभव है कि आप कुछ विवादों के मुद्दों का सामना कर रहे हों, फ़ाइल को लिखने में कभी-कभी देरी होने के कारण फ़ाइल को एक छोटी अवधि के लिए लिखने के खिलाफ फ़ाइल को लॉक करना। – DarinH

+0

नेटवर्क की गति क्या है? ड्रैवचर द्वारा वर्णित, कम, विवाद, यह अपराधी हो सकता है। और यह कनेक्शन अन्य कार्यक्रमों/उपयोगकर्ताओं द्वारा उपयोग किया जाता है? – MarcelDevG

उत्तर

12

सबसे तेजी से विकल्प:

पहले एक बड़ी स्ट्रिंग में अपने सभी पाठ को एकत्र करें और उसके बाद System.IO.File.WriteAllText(text) का उपयोग करें।

1

कुछ ऐसी चीजें हैं जो यहां प्रभावी होती हैं। लेकिन मुझे पता चला है कि IO.File.AppendText फ़ंक्शन का उपयोग लेखन प्रक्रियाओं को अत्यधिक गति देता है।

इसके अतिरिक्त, System.Text.Stringbuilder क्लास का उपयोग पारंपरिक स्ट्रिंग के रूप में विरोध करने के रूप में (माना जाता है कि आप फ़ाइल को लिखने के लिए पाठ को जोड़ रहे हैं) गति को और भी बेहतर बनाता है।

Speeding up File Writing देखें।

+0

एमएमएम ... लगता है कि यह एपेंटेक्स्ट वास्तव में वादा करता है, लेख के लिए बहुत बहुत धन्यवाद, मैं इसे आज़मा दूंगा और आपको बता दूंगा, धन्यवाद! – AZhu

1

यह फ़ंक्शन डेटाबेस और आउटपुट से टेक्स्ट फ़ाइल में पढ़ने के लिए लिखा गया था। कृपया इसे शुरुआती बिंदु के रूप में उपयोग करने में संकोच न करें।

Sub MakeFile(ByVal Obj As Object) 
    Dim CountRow As Integer = 0 
    Dim TableName As String = CType(Obj, String())(0) 
    Dim CommandText As String = CType(Obj, String())(1) 


    Dim csvFileName As String = InitilizationSettings.DirectoryPath & TableName & ".txt" 
    If File.Exists(csvFileName) Then 
     File.Delete(csvFileName) 
    End If 
    Dim buffer() As Byte = {255} 
    Dim FileObject As New FileStream(csvFileName, FileMode.OpenOrCreate) 
    Dim MStream As New MemoryStream() 
    Dim StreamWriterObj As New StreamWriter(MStream) 
    Dim sb As New System.Text.StringBuilder 
    Dim x As Integer = 0 

    Dim reader As SqlDataReader 
    Dim cmd As New SqlCommand() 
    Dim conn As New SqlConnection(IOUtilities.GetConnectionString()) 


    conn.Open() 


    With cmd 
     .CommandText = CommandText 
     .CommandTimeout = 1200 
     .CommandType = CommandType.Text 
     .Connection = conn 
    End With 

    reader = cmd.ExecuteReader() 

    Do While reader.Read() 
     'System.Console.Write("Loading rows to memory.../" & vbCr) 
     sb.Append(Chr(34)) 
     sb.Append(reader.Item(0)) 
     'System.Console.Write("Loading rows to memory...|" & vbCr) 
     sb.Append(Chr(34)) 
     For i = 1 To reader.FieldCount - 1 
      sb.Append(",") 
      sb.Append(Chr(34)) 
      sb.Append(reader.Item(i)) 
      sb.Append(Chr(34)) 
     Next 
     'System.Console.Write("Loading rows to memory...\" & vbCr) 



     sb.AppendLine() 

     'Write every 10000 rows of data to the file from the buffer 
     If x = 50000 Then 
      StreamWriterObj.Write(sb.ToString().ToCharArray()) 
      MStream.Seek(0, SeekOrigin.Begin) 
      MStream.WriteTo(FileObject) 
      sb = New StringBuilder() 
      CountRow = CountRow + x 
      x = 0 
     End If 
     'System.Console.Write("Loading rows to memory...-" & vbCr) 
     x = x + 1 


     'LogEvents("Dumped " & strFileName & " to " & GetFilePath() & " at " & Now.ToString & vbCrLf & vbCrLf) 
    Loop 

    conn.Close() 
    reader.Close() 
    'Write any remaining data from the buffer to the file 
    StreamWriterObj.Write(sb.ToString().ToCharArray()) 
    MStream.WriteTo(FileObject) 
    FileObject.Close() 

    System.Console.WriteLine(String.Format(vbCrLf & "Finished writing data to {1}", CountRow, csvFileName)) 

End Sub 
-1

पहले स्थानीय ड्राइव पर लिखने पर विचार करें, फिर उस फ़ाइल को अपने नेटवर्क ड्राइव पर ले जाएं।

1

बदले में इन पर विचार करें:

  1. फ़ाइल बनाएँ स्थानीय स्तर पर
  2. एक अस्थायी विस्तार के साथ दूरदराज के फ़ोल्डर में प्रतिलिपि
  3. अपने मूल फ़ाइल नाम

चरण के लिए दूरस्थ फ़ाइल का नाम बदलें 2 और 3 निम्नानुसार है (System.IO का उपयोग करके):

string OriginalExtension = ".ok", TemporaryExtension = ".dat"; 
string tmpFileRemote = RemoteFile.Replace(TemporaryExtension, OriginalExtension); 
File.Copy(fileName, RemoteFile, true); 
File.Copy(RemoteFile, tmpFileRemote, true); 
File.Delete(RemoteFile); 

पहली फ़ाइल। कॉपी समय लेता है। लेकिन चूंकि यह वास्तविक फ़ाइल को लॉक नहीं करता है, इसलिए लोग लॉक नहीं होते हैं। दूसरी फ़ाइल। कॉपी वास्तव में सिर्फ फ़ाइल का नाम बदलती है और वास्तविक फ़ाइल को बस अपलोड किए गए स्थान से बदल देती है। फ़ाइल। हटाए गए अस्थायी फ़ाइल को हटा देता है।

उम्मीद है कि मदद करता है।

-1
Sub writefile() 
    Dim file As System.IO.StreamWriter 
    file = My.Computer.FileSystem.OpenTextFileWriter("N:\GeneratedNumber.txt", False) 
    file.WriteLine("Player1 Skill is " & Skill(0)) 
    file.WriteLine("Player1 Strength is " & Skill(1)) 
    file.WriteLine("Player2 Skill is " & Skill(2)) 
    file.WriteLine("Player2 Strength is " & Skill(3)) 
    file.Close() 
End Sub 
+0

अच्छा होगा अगर आप समझा सकें कि मौजूदा उत्तर की तुलना में आपका उत्तर अधिक कुशल (प्रश्न मांग के रूप में) कैसे है। साथ ही, कोड को हाइलाइट करने के लिए मेनू में "कोड नमूना" का उपयोग करें। – gsk

0

एक पुरानी धागा लेकिन मुझे लगता है कि अभी भी जोड़ने के लिए कुछ न कुछ है: (पथ स्ट्रिंग के रूप में, सामग्री स्ट्रिंग के रूप में)
System.IO.File.WriteAllText:

लिखें सभी पाठ एक बार का उपयोग करने में।

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

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