我们需要将一些信息(大约18 KB)写入存储在我们其中一个网络驱动器上的.txt文件中。该文件大约每15分钟重写一次,但几乎每秒都会读取一次。我们目前正在使用StreamWriter来编写文件。
文件服务器位于远程位置,往返ping从小于1毫秒到15毫秒不等。
问题是,有时将内容写入文件需要6秒钟,即使考虑到网络速度,这肯定太长了。
因此,我只是想知道是否有任何有效的方法使用VB.NET编写文件来提高性能? Java有一个非常好的名为BufferedOutputStream的工具,遗憾的是它在VB.NET中不可用(或者我还没有找到它)。
答案 0 :(得分:13)
最快的选择:
首先将所有文字收集到一个大字符串中,然后使用System.IO.File.WriteAllText(text)
。
答案 1 :(得分:1)
这里有几件事要生效。但我发现利用 IO.File.AppendText 功能可以极大地加快编写过程。
此外,使用System.Text.Stringbuilder类而不是传统字符串(假设您要将文本进行联接以写入文件)可以进一步提高速度。
请参阅 Speeding up File Writing 。
答案 2 :(得分: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
答案 3 :(得分:1)
依次考虑这些:
步骤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删除上传的临时文件。
希望有所帮助。
答案 4 :(得分:0)
一个旧帖子,但我认为还有一些事情需要补充:
使用以下方法一次性写入所有文本:
System.IO.File.WriteAllText(path As String,contents As String)。
但是,如果通过与远程位置的慢速连接写入文件,则仍需要时间。为避免用户读取部分写入的文件,您应将数据写入远程服务器上的临时文件。写完所有数据后,将临时文件复制到旧文件上,然后删除临时文件。
如果您想确实确定没有人读取部分写入的文件,您可以删除旧文件,然后移动/重命名临时文件以替换刚刚删除的文件。在这种情况下,您必须确保客户端程序正常处理文件未找到的错误,这些错误将不时发生。
答案 5 :(得分:-1)
首先考虑写入本地驱动器,然后将该文件移动到网络驱动器。
答案 6 :(得分:-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