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

わんくま同盟

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

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


■83387 / )  巨大なテキストファイルを高速で出力する方法
□投稿者/ バカボドン (1回)-(2017/03/20(Mon) 16:51:51)

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

返信 編集キー/


管理者用

- Child Tree -