分類:[.NET 全般]
2017/03/20(Mon) 16:53:45 編集(投稿者)
2017/03/20(Mon) 16:53:06 編集(投稿者)
<pre><pre>2017/03/20(Mon) 16:52:46 編集(投稿者)
2017/03/20(Mon) 16:52:43 編集(投稿者)
<pre><pre>
以下のコードで巨大なSingle配列を
数百MByte程度のサイズの一列のテキストファイルとして出力するコードを書きました。
Dim a(xmax, ymax, zmax) As Single
Using writer As New StreamWriter(Path, False, Encoding.ASCII)
For zzz As Integer = 1 To zmax
For yyy As Integer = 1 To ymax
For xxx As Integer = 1 To xmax
writer.WriteLine(a(xxx, yyy, zzz).ToString)
Next xxx
Next yyy
Next zzz
End Using
ただ、タスクマネージャーで確認すると
ストレージの帯域は5%程度しか使っておらず
CPU使用率も10%程度となっています。
これをマルチスレッド化して高速出力したいのですが
どのようにすれば良いですか?
Single→String→Byteという2段階のデータ変換を行っていることになるので
どちらが律速しているか調べるために
以下のマルチスレッドコードを書いて計算時間を比較しました。
For zzz As Integer = 1 To zmax
Dim XY(xmax, ymax) As String
Dim zzz2 As Integer = zzz
Parallel.For(1, ymax + 1, Sub(yyy)
For xxx As Integer = 1 To xmax
XY(xxx, yyy) = a(xxx, yyy, zzz2).ToString
Next xxx
End Sub)
For yyy As Integer = 1 To ymax
For xxx As Integer = 1 To xmax
writer.WriteLine(XY(xxx, yyy))
Next xxx
Next yyy
Next zzz
しかし計算時間は全く変わりませんでした。
そのため、String→Byteの変換が律速していると考えています。
Dim bytesData As Byte() = System.Text.Encoding.GetEncoding(932).GetBytes(str)
というコードで、String→Byte配列への変換を行うことができるのは分かるのですが、
どのようにマルチスレッド化すれば良いでしょうか?
ファイルサイズが数百MByte程度になるので
一度に全てをバイト配列にして最後に出力するというのは避けたいです。
For zzz As Integer = 1 To zmax
の部分を4つくらいのスレッドの分離して
マルチスレッドで処理するのがもっとも適当でしょうか?
</pre></pre></pre></pre>