9

ネットワークドライブの1つに保存されている.txtファイルに書き込む必要のある情報(約18 KB)があります。ファイルは約15分に1回書き換えられますが、実際には少なくとも1秒に1回読み取られます。現在、StreamWriterを使用してファイルを書き込んでいます。

ファイルサーバーはリモートロケーションにあり、ラウンドトリップpingは1ミリ秒未満から15ミリ秒まで変化します。

問題は、ファイルに内容を書き込むのに6秒もかかる場合があることです。これは、ネットワーク速度を考慮した後でも、明らかに長すぎることです。

したがって、パフォーマンスを向上させるためにVB.NETを使用してファイルを書き込む効率的な方法があるかどうか疑問に思っていますか?JavaにはBufferedOutputStreamという名前の非常に優れたツールがありますが、残念ながらVB.NETでは使用できません(または私はそれを見つけられませんでした)。

4

7 に答える 7

15

最速のオプション:

最初にすべてのテキストを1つの大きな文字列にまとめてから、を使用しますSystem.IO.File.WriteAllText(fileName, text)

于 2011-01-24T19:40:31.003 に答える
1

ここで有効になることがいくつかあります。しかし、IO.File.AppendText関数を使用すると、書き込みプロセスが大幅に高速化されることがわかりました。

さらに、従来の文字列とは対照的に System.Text.Stringbuilder クラスを使用すると (テキストを連結してファイルに書き込むと仮定して)、速度がさらに向上します。

ファイル書き込みの高速化を参照してください。

于 2011-01-24T19:45:12.097 に答える
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
于 2011-01-24T19:50:18.237 に答える
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);

最初の File.Copy には時間がかかります。しかし、人々が使用している実際のファイルをロックしないため、ロックされません。2 番目の File.Copy は、実際にはファイルの名前を変更し、実際のファイルをアップロードしたばかりのファイルに置き換えます。File.Delete は、アップロードされた一時ファイルを削除します。

それが役立つことを願っています。

于 2011-07-29T14:06:07.217 に答える
-1

最初にローカルドライブに書き込み、次にそのファイルをネットワークドライブに移動することを検討してください。

于 2011-01-24T22:57:50.497 に答える
-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
于 2014-11-03T11:45:55.053 に答える