C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■83253 / )  大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ 金尾 (1回)-(2017/03/15(Wed) 20:40:08)

分類:[.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





返信 編集キー/


管理者用

- Child Tree -