|
分類:[.NET 全般]
10MBのテキストファイルが1万個ほどあり、 これを読み込んで、その内容をまとめたデータを作成したいと考えています。
普通にReadlineで読み込んでいくと 10分くらいかかってしまいます。 ただ、CPU使用率を見ていると、シングルスレッドで動作しているため、 10%程度しか使用していないため マルチスレッドにすれば10倍近くに高速化できると思います。
それで、以下のように10個ずつファイルを読み込んで マルチスレッドでプログラムを作成したみたのですが どうも、 Encoding.UTF8.GetString(bs).Split(CChar(vbCrLf)) というコマンドをマルチスレッドにしてもほとんど速くなりません。
恐らく、メモリがボトルネックになり、 同時に複数の配列を処理できていないのではないかと思うのですが、 タスクマネージャやリソースモニターでは メモリの使用量は確認できても、メモリの転送速度はモニターできないので それが正しいかどうか分かりません。
どうすれば、もっと高速化することができますか?
以下がコードです。
Sub code
For i = 1 to 1000
Dim fs As New FileStream(Path(i), FileMode.Open, FileAccess.Read) Dim bs1(file_size - 1) As Byte fs.Read(bs1, 0, file_size) fs.Close() MultiTask_in01 = New Task(AddressOf Data_in, bs01) MultiTask_in01.Start()
fs = New FileStream(Path(i + 1), FileMode.Open, FileAccess.Read) Dim bs2(file_size - 1) As Byte fs.Read(bs2, 0, file_size) fs.Close() MultiTask_in02 = New Task(AddressOf Data_in, bs02) MultiTask_in02.Start()
'・・・・
fs = New FileStream(Path(i + 9), FileMode.Open, FileAccess.Read) Dim bs10(file_size - 1) As Byte fs.Read(bs10, 0, file_size) fs.Close() MultiTask_in10 = New Task(AddressOf Data_in, bs10) MultiTask_in10.Start()
next i
End Sub
Private Sub Data_in(ByVal bs0() As Byte)
Dim bs() As Byte = bs0.Clone
Dim str() As String = Encoding.UTF8.GetString(bs).Split(CChar(vbCrLf))
'ここにデータをまとめるための処理を書く。
End Sub
|