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>

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
親記事 →Re[1]: 巨大なテキストファイルを高速で出力する方法 /Azulean
→Re[1]: 巨大なテキストファイルを高速で出力する方法 /shu
 
上記関連ツリー

巨大なテキストファイルを高速で出力する方法 / バカボドン (17/03/20(Mon) 16:51) #83387 ←Now
Re[1]: 巨大なテキストファイルを高速で出力する方法 / Azulean (17/03/20(Mon) 20:44) #83390
│└ Re[2]: 巨大なテキストファイルを高速で出力する方法 / なちゃ (17/03/20(Mon) 23:01) #83391
Re[1]: 巨大なテキストファイルを高速で出力する方法 / shu (17/03/20(Mon) 23:32) #83395
    └ Re[3]: 巨大なテキストファイルを高速で出力する方法 / なちゃ (17/03/20(Mon) 23:20) #83393
      └ Re[4]: 巨大なテキストファイルを高速で出力する方法 / バカボドン (17/03/20(Mon) 23:31) #83394
        └ Re[5]: 巨大なテキストファイルを高速で出力する方法 / なちゃ (17/03/21(Tue) 12:29) #83401
          └ Re[6]: 巨大なテキストファイルを高速で出力する方法 / バカボドン (17/03/21(Tue) 13:19) #83402
            └ Re[7]: 巨大なテキストファイルを高速で出力する方法 / もりお (17/03/21(Tue) 20:47) #83403
              └ Re[8]: 巨大なテキストファイルを高速で出力する方法 / バカボドン (17/03/21(Tue) 21:01) #83404
                └ Re[9]: 巨大なテキストファイルを高速で出力する方法 / もりお (17/03/21(Tue) 21:13) #83405
                  └ Re[10]: 巨大なテキストファイルを高速で出力する方法 / バカボドン (17/03/21(Tue) 21:47) #83406
                    └ Re[11]: 巨大なテキストファイルを高速で出力する方法 / もりお (17/03/22(Wed) 01:29) #83408
                      └ Re[12]: 巨大なテキストファイルを高速で出力する方法 / バカボドン (17/03/22(Wed) 09:22) #83410
                        └ Re[13]: 巨大なテキストファイルを高速で出力する方法 / バカボドン (17/03/22(Wed) 09:30) #83412
                          └ Re[14]: 巨大なテキストファイルを高速で出力する方法 / バカボドン (17/03/22(Wed) 09:41) #83413
                            └ Re[15]: 巨大なテキストファイルを高速で出力する方法 / バカボドン (17/03/22(Wed) 10:18) #83414
                              └ Re[16]: 巨大なテキストファイルを高速で出力する方法 / PANG2 (17/03/22(Wed) 13:53) #83418
                                └ Re[17]: 巨大なテキストファイルを高速で出力する方法 / バカボドン (17/03/22(Wed) 14:28) #83420
                                  └ Re[18]: 巨大なテキストファイルを高速で出力する方法 / なちゃ (17/03/22(Wed) 15:29) #83421
                                    └ Re[19]: 巨大なテキストファイルを高速で出力する方法 / バカボドン (17/03/23(Thu) 19:10) #83442 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信