2011-01-24 46 views
6

Chúng tôi có một số thông tin mà chúng tôi cần viết (khoảng 18   KB) vào tệp .txt được lưu trữ trên một trong các ổ đĩa mạng của chúng tôi. Các tập tin được viết lại khoảng một lần mỗi 15 phút, nhưng nó được đọc thực tế ít nhất mỗi giây. Chúng tôi hiện đang sử dụng StreamWriter để ghi tệp.Cách viết văn bản hiệu quả vào một tệp văn bản trong VB.NET

Máy chủ tệp ở vị trí ở xa và ping chuyến đi khứ hồi thay đổi từ ít hơn 1   ms đến 15   ms.

Vấn đề là, đôi khi phải mất đến 6 giây để ghi nội dung vào tệp, điều này chắc chắn là quá dài ngay cả sau khi chúng tôi xem xét tốc độ mạng.

Vì vậy, tôi chỉ tự hỏi liệu có cách nào hiệu quả để viết tệp bằng VB.NET để cải thiện hiệu suất không? Java có một công cụ rất tốt có tên là BufferedOutputStream, mà không may là không có sẵn trong VB.NET (hoặc tôi chỉ không tìm thấy nó).

+1

StreamWriter đã được lưu vào bộ đệm. –

+0

Chỉ là một ý nghĩ. Nếu bạn đang đọc nó thường xuyên, có thể bạn có thể gặp phải một số vấn đề tranh chấp, nhiều người đọc khóa tập tin chống lại viết trong một thời gian ngắn gây ra sự chậm trễ thường xuyên bằng văn bản các tập tin. – DarinH

+0

Tốc độ mạng là bao nhiêu? Của nó là thấp, ganh đua, như được mô tả bởi drventure, có thể là culpit. Và là kết nối được sử dụng bởi các chương trình/người dùng khác ?. – MarcelDevG

Trả lời

12

Các tùy chọn nhanh nhất:

Thu thập tất cả văn bản của bạn thành một chuỗi lớn đầu tiên và sau đó sử dụng System.IO.File.WriteAllText(text).

1

Có một vài điều có hiệu lực tại đây. Nhưng tôi đã thấy rằng việc sử dụng hàm IO.File.AppendText sẽ tăng tốc quá trình viết vô cùng.

Ngoài ra, sử dụng lớp System.Text.Stringbuilder trái ngược với chuỗi truyền thống (giả sử bạn đang lồng ghép văn bản để ghi vào tệp) cải thiện tốc độ nhiều hơn.

Xem Speeding up File Writing.

+0

Mmm ... dường như appendtext này có vẻ thực sự hứa hẹn, cảm ơn rất nhiều cho bài viết, tôi sẽ thử và cho bạn biết, cảm ơn! – AZhu

1

Chức năng này được viết để đọc từ cơ sở dữ liệu và xuất ra tệp văn bản. Xin vui lòng sử dụng nó như là một điểm khởi đầu.

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

Cân nhắc việc ghi vào ổ đĩa cục bộ trước, sau đó chuyển tệp đó vào ổ đĩa mạng của bạn.

1

Hãy xem xét những lần lượt:

  1. Tạo tập tin cục bộ
  2. Sao chép nó vào thư mục từ xa với một phần mở rộng tạm thời
  3. Đổi tên tập tin từ xa để tên file ban đầu của bạn

Bước 2 và 3 như sau (sử dụng 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); 

File.Copy đầu tiên mất thời gian. Nhưng vì nó không khóa tập tin thực mà mọi người đang sử dụng, nó không bị khóa. File.Copy thứ hai thực sự chỉ đổi tên tệp và thay thế tệp thực bằng tệp vừa tải lên. File.Delete xóa tệp tạm thời được tải lên.

Hy vọng điều đó sẽ hữu ích.

-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

Sẽ tốt nếu bạn có thể giải thích cách câu trả lời của bạn hiệu quả hơn (như yêu cầu câu hỏi) so với câu trả lời hiện có. Ngoài ra, hãy sử dụng "Mẫu mã" trong trình đơn để làm nổi bật mã. – gsk

0

Một chủ đề cũ nhưng tôi nghĩ vẫn có cái gì đó để thêm:

Viết tất cả các văn bản cùng một lúc sử dụng:
System.IO.File.WriteAllText (đường dẫn As String, nội dung As String).

Tuy nhiên, vẫn cần có thời gian để ghi tệp nếu tệp đang được ghi qua kết nối chậm đến một vị trí ở xa. Để tránh việc người dùng đọc một tệp được viết một phần, bạn nên ghi dữ liệu vào một tệp tạm thời trên máy chủ từ xa. Khi tất cả dữ liệu đã được ghi, hãy sao chép tệp tạm thời qua tệp cũ và sau đó xóa tệp tạm thời.

Nếu bạn muốn thực sự chắc chắn không ai đọc tệp được viết một phần, bạn có thể xóa tệp cũ và sau đó di chuyển/đổi tên tệp tạm thời để thay thế tệp bạn vừa xóa. Trong trường hợp này, bạn phải chắc chắn rằng các chương trình khách hàng xử lý một cách duyên dáng các tệp không tìm thấy các lỗi chắc chắn sẽ xảy ra theo thời gian.

Các vấn đề liên quan