Frage

Wir haben einige Informationen, die wir schreiben müssen (ca. 18 KB) in eine .txt -Datei, die auf einem unserer Netzwerk -Laufwerke gespeichert ist. Die Datei wird ungefähr alle 15 Minuten neu geschrieben, aber sie wird praktisch mindestens jede Sekunde gelesen. Wir verwenden derzeit StreamWriter, um die Datei zu schreiben.

Der Dateiserver befindet sich an einem Remote -Ort und der Rundreise -Ping variiert von weniger als 1 ms bis 15 ms.

Das Problem ist, manchmal dauert es bis zu sechs Sekunden, um den Inhalt in die Datei zu schreiben, was definitiv viel zu lang ist, selbst nachdem wir die Netzwerkgeschwindigkeit berücksichtigt haben.

Daher frage ich mich nur, ob es eine effiziente Möglichkeit gibt, die Datei mit VB.NET zu schreiben, um die Leistung zu verbessern? Java hat ein sehr gutes Tool namens BufferedOutputStream, das leider nicht in VB.NET verfügbar ist (oder ich habe es einfach nicht gefunden).

War es hilfreich?

Lösung

Die schnellste Option:

Sammeln Sie zuerst alle Ihren Text in eine große Zeichenfolge und verwenden Sie dann System.IO.File.WriteAllText(text).

Andere Tipps

Diese Funktion wurde so geschrieben, dass sie aus einer Datenbank gelesen und in eine Textdatei ausgegeben wurde. Bitte nutzen Sie es als Ausgangspunkt.

 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

Betrachten Sie diese wiederum:

  1. Erstellen Sie die Datei lokal
  2. Kopieren Sie es mit einer temporären Erweiterung in den Remote -Ordner
  3. Benennen Sie die Remotedatei in Ihrem Original -Dateinamen um

Schritt 2 und 3 ist wie folgt (mit 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);

Die erste Datei.Copy nimmt sich die Zeit. Da es jedoch nicht die realen Datei sperrt, die Leute verwenden, wird es nicht gesperrt. Die zweite Datei. Datei.Delete löscht die hochgeladene temporäre Datei.

Ich hoffe, das hilft.

Es gibt ein paar Dinge, die hier in Kraft treten. Aber ich habe das mit der Verwendung der verwendet Io.file.appendText Die Funktion beschleunigt die Schreibprozesse immens.

Darüber hinaus verbessert die Verwendung des Systems.

Sehen Beschleunigung der Datei schreiben.

Ein alter Thread, aber ich denke, es gibt immer noch etwas hinzuzufügen:

Schreiben Sie alle Text gleichzeitig mit:
System.io.File.WriteAlltext (Pfad als String, Inhalt als String).

Es dauert jedoch noch Zeit, die Datei zu schreiben, wenn sie über eine langsame Verbindung zu einem Remote -Standort geschrieben wird. Um zu vermeiden, dass Benutzer eine teilweise geschriebene Datei lesen, sollten Sie die Daten in eine temporäre Datei auf dem Remote -Server schreiben. Sobald alle Daten geschrieben wurden, kopieren Sie die temporäre Datei über die alte Datei und löschen Sie dann die temporäre Datei.

Wenn du sein willst Ja wirklich Sicher, niemand liest eine teilweise geschriebene Datei. Sie können die alte Datei löschen und dann die temporäre Datei verschieben/umbenennen, um die gerade gelöschte Datei zu ersetzen. In diesem Fall müssen Sie sicherstellen, dass die Client -Programme anmutig keine Fehler gefunden haben, die von Zeit zu Zeit unweigerlich auftreten.

Erwägen Sie zuerst auf ein lokales Laufwerk zu schreiben und dann diese Datei in Ihr Netzwerklaufwerk zu verschieben.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top