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

该文件服务器位于远程位置,往返ping从少于1 ms到15 ms不等。

问题是,有时将内容写入文件的内容需要长达六秒钟,即使我们考虑网络速度,这绝对是太久了。

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

有帮助吗?

解决方案

最快的选项:

首先将所有文本收集到一个大字符串中,然后使用 System.IO.File.WriteAllText(text).

其他提示

该功能写为从数据库中读取并输出到文本文件。请随时将其用作起点。

 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. 在本地创建文件
  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.delete删除上传的临时文件。

希望有帮助。

这里有几件事生效。但是我发现这是利用的 io.file.appendtext 功能可以极大地加快写作过程。

此外,使用System.Text.StringBuilder类,而不是传统的字符串(假设您要注销文本要写入文件)可以更加提高速度。

加速文件写作.

一个旧线程,但我认为仍然可以添加一些东西:

立即使用:
system.io.file.writeAlText(路径为字符串,内容为字符串)。

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

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

考虑首先写入本地驱动器,然后将该文件移至您的网络驱动器。

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top