2016-05-27 18 views
2

文字列の.txtファイルを読み込み、さまざまな結果を返すようにデータを操作するプログラムを作成する必要があります。 私の問題は、実行のタイミングです。VB.net - 高速なテキスト操作/配列への格納

辞書スタイルのtxtファイルにこれを実行する
Dim OpenAnswerFile As New OpenFileDialog 
    OpenAnswerFile.Multiselect = True 
    Dim strFileName() As String '// String Array. 
    Dim tempStr As String = "" '// temp String for result. 
    Dim FileName As String 
    Dim Watcher As New Stopwatch 
    If OpenAnswerFile.ShowDialog = DialogResult.OK Then 
     Watcher.Restart() 
     For Each FileName In OpenAnswerFile.FileNames 

      strFileName = IO.File.ReadAllLines(FileName) 
      For Each myLine In strFileName 
       tempStr &= myLine & vbNewLine 
      Next 

     Next 
     Watcher.Stop() 
     Dim TimeToArrays = Watcher.Elapsed 
     Watcher.Reset() 
     '========================WRITE TO FILE 
     Dim file As System.IO.StreamWriter 
     file = My.Computer.FileSystem.OpenTextFileWriter("c:\test.txt", True) 
     Watcher.Restart() 
     file.Write(tempStr) 
     file.WriteLine(TimeToArrays) 
     file.WriteLine(Watcher.Elapsed) 
     Watcher.Stop() 
     file.Close() 

     '========================WRITE TO FILE 

    End If 

は、からZまで、私はちょうどファイルの1メガバイト以上の合計たくさん見つける分、約かかります。

プロセス全体をスピードアップする方法はありますか?

+0

は、文字列でそれらのすべてを保存せずにファイルを連結しようとしたことがありますか? –

答えて

2

このコードを試してください。ほぼ90Mbのファイルで6.5秒で実行されます。あなたのコードに

変更はのようにまとめることができます

  • DialogResultをチェックして、ルーチンのこの部分が完了するまでのファイルを反復しません。

  • 読み取り操作では、Using...End Usingを使用してIOを効率的にします。

  • List(of String)を使用すると、文字列に追加するのではなく、データを保持できます。私はこれがメモリ管理の観点からより効率的だと思います。他のコレクションを使う方が早いかもしれません。

  • 書き込み操作中に、Using...End Usingを使用してIOを効率的にします。ここで

はコードです:

Sub DoItQuicker() 

    Dim OpenAnswerFile As New OpenFileDialog 
    OpenAnswerFile.Multiselect = True 
    Dim strFileName() As String '// String Array. 
    Dim strSingleFileContent As String 
    Dim strFileData As New List(Of String) 
    Dim FileName As String 
    Dim Watcher As New Stopwatch 

    'get user feedback 
    If OpenAnswerFile.ShowDialog <> DialogResult.OK Then 
     MessageBox.Show("Not OK") 
     Exit Sub 
    Else 
     strFileName = OpenAnswerFile.FileNames 
    End If 
    OpenAnswerFile.Dispose() 

    'read data 
    Watcher.Restart() 
    For Each FileName In OpenAnswerFile.FileNames 

     Using sr As New IO.StreamReader(FileName) 
      strSingleFileContent = sr.ReadToEnd 
      For Each line As String In strSingleFileContent.Split(vbLf) 
       strFileData.Add(line) 
      Next 
     End Using 

    Next 
    Watcher.Stop() 
    Dim TimeToArrays = Watcher.Elapsed 
    Debug.Print(Watcher.ElapsedMilliseconds) 

    'write data 
    Watcher.Restart() 
    Using sw As New IO.StreamWriter("D:\temp\out.txt") 
     For Each line As String In strFileData 
      sw.WriteLine(line) 
     Next 
     sw.WriteLine(TimeToArrays) 
     sw.WriteLine(Watcher.Elapsed) 
    End Using 
    Watcher.Stop() 
    Debug.Write(Watcher.ElapsedMilliseconds) 


End Sub 
+0

私はちょうどそれをテストし、私のコードを使って~1mから0.09sで走った。どうもありがとうございました。 しかし、私がこのコードを使用している問題は、出力がそれぞれの文字をそれ自身の行に格納していることです。 1行に1語をどれくらい保存できますか? – SpK

+0

各ファイルのサンプルコンテンツとは何ですか?テストのために 'foo、bar'という何千もの行のテストファイルを生成しました。 –

+0

https:// we .tl/beABagB9cI WeTransferでファイルをアップロードしています。私が実行していることを確認できます。 本当にうまくいきます。各行を改行して.txtファイルを保存するだけです。 編集:各処理済みの単語の後ろに空白の行が2つ残っているようです。 – SpK

関連する問題