9

我们有一些信息需要写入(大约 18 KB)到存储在我们的一个网络驱动器上的 .txt 文件中。该文件大约每 15 分钟重写一次,但实际上至少每秒读取一次。我们目前正在使用 StreamWriter 来写入文件。

文件服务器位于远程位置,往返 ping 的时间从不到 1 毫秒到 15 毫秒不等。

问题是,有时将内容写入文件需要长达六秒钟的时间,即使考虑到网络速度,这也肯定是太长了。

因此,我只是想知道是否有任何有效的方法来使用 VB.NET 编写文件来提高性能?Java 有一个非常好的工具,名为 BufferedOutputStream,不幸的是,它在 VB.NET 中不可用(或者我只是没有找到它)。

4

7 回答 7

15

最快的选择:

首先将所有文本收集到一个大字符串中,然后使用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 需要时间。但由于它不会锁定人们正在使用的真实文件,因此它不会被锁定。第二个 File.Copy 实际上只是重命名文件并将真实文件替换为刚刚上传的文件。File.Delete 删除上传的临时文件。

希望有帮助。

于 2011-07-29T14:06:07.217 回答
0

一个旧线程,但我认为还有一些东西要补充:


使用: System.IO.File.WriteAllText(路径为字符串,内容为字符串)一次写入所有文本。

但是,如果文件是通过与远程位置的慢速连接写入的,则写入文件仍然需要时间。为避免用户读取​​部分写入的文件,您应该将数据写入远程服务器上的临时文件。写入所有数据后,将临时文件复制到旧文件上,然后删除临时文件。

如果您想确定没有人读取部分写入的文件,您可以删除旧文件,然后移动/重命名临时文件以替换您刚刚删除的文件。在这种情况下,您必须确保客户端程序优雅地处理文件未找到错误,这些错误将不可避免地不时发生。

于 2017-11-04T08:52:46.640 回答
-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 回答