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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 | 1 >>
■83413  Re[14]: 巨大なテキストファイルを高速で出力する方法
□投稿者/ バカボドン -(2017/03/22(Wed) 09:41:40)
    あと、WriteLineとの方法とも比較してみましたが、
    外側のループのサイズに依存せず、WriteLineの方が常に20%程度遅くなる結果が得られました
    やはり、少しずつ細切れに出力するように
    一気に出力する方が良いのでしょうか・・・?
記事No.83387 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83414  Re[15]: 巨大なテキストファイルを高速で出力する方法
□投稿者/ バカボドン -(2017/03/22(Wed) 10:18:30)
    どうも、元のコードだと
    GetBytesAndWriteSync
    がファイルを書き込むコードになっていないようでした。
    
    あと、
    外側のループを減らすために、以下のようにxyまるごと配列にして出力する方法も試してみましたが
    なぜか10倍くらい遅くなってしまいました
    
    
    
    
        <MethodImpl(MethodImplOptions.NoOptimization)>
        Sub GetBytesAndWriteASync4(ByVal a(,,) As Single, ByVal enc As Encoding, ByVal path As String)
            Using stream As New FileStream(path, FileMode.Create)
    
    
                For z As Integer = 0 To a.GetUpperBound(0)
    
    
                        Dim buf(a.GetUpperBound(1))() As Byte
    
    
                        Dim zz As Integer = z
    
                        Parallel.For(0, buf.Length,
                                     Sub(y)
                                    buf(y) = {}
                                    For x As Integer = 0 To a.GetUpperBound(2)
    
                                        buf(y) = buf(y).Concat(enc.GetBytes(a(zz, y, x).ToString())).ToArray()
    
                                    Next
    
                                     End Sub)
    
                       For Each b In buf
                            stream.Write(b, 0, b.Length)
                            stream.WriteByte(&HD)       'CR
                            stream.WriteByte(&HA)       'LF
                      Next b
    
    
                Next z
    
    
            End Using
        End Sub
    
    
記事No.83387 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83418  Re[16]: 巨大なテキストファイルを高速で出力する方法
□投稿者/ PANG2 -(2017/03/22(Wed) 13:53:27)
    2017/03/22(Wed) 14:18:07 編集(投稿者)

    No83414 (バカボドン さん) に返信
    > 外側のループを減らすために、以下のようにxyまるごと配列にして出力する方法も試してみましたが
    > なぜか10倍くらい遅くなってしまいました

    改良案
    Sub GetBytesAndWriteASync5(ByVal a(,,) As Single, ByVal enc As Encoding, ByVal path As String)
    Using stream As New StreamWriter(path, FileMode.Create)
    For z As Integer = 0 To a.GetUpperBound(0)
    Dim buf(a.GetUpperBound(1)) As StringWriter
    Dim zz As Integer = z
    Parallel.For(0, buf.Length,
    Sub(y)
    buf(y) = New StringWriter()
    For x As Integer = 0 To a.GetUpperBound(2)
    buf(y).WriteLine(a(zz, y, x))
    Next
    End Sub
    )

    For Each b In buf
    stream.Write(b.ToString())
    Next b
    Next z
    End Using
    End Sub

    追記
    For Each b In buf
    をTask化すれば、さらに速くなる
記事No.83387 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83420  Re[17]: 巨大なテキストファイルを高速で出力する方法
□投稿者/ バカボドン -(2017/03/22(Wed) 14:28:54)

    改良案ありがとうございます。

    配列サイズが大きい時に高速で処理できることが分かりました


    ところで、いろいろと試していて気がついたことなのですが


    Dim zmax As Integer = 1
    Dim ymax As Integer = 30
    Dim xmax As Integer = 30

    の時、
    GetBytesAndWriteSync 0.0013647秒
    GetBytesAndWriteASync5 0.0476627秒
    と40倍くらいの差が出ます。

    一方で、

    Dim zmax As Integer = 300
    Dim ymax As Integer = 30
    Dim xmax As Integer = 30

    の時、
    GetBytesAndWriteSync 0.1473秒
    GetBytesAndWriteASync5 0.1095秒

    のように差異が狭まり1.5倍程度しか差が出なくなります。

    xmaxやymaxを大きくすると
    並列化処理が有効になるので、
    GetBytesAndWriteASync5が高速になるのは予想できることですが
    xmaxやymaxを固定したまま
    zmaxを大きくしても
    GetBytesAndWriteASync5が高速になるのはなぜなのでしょうか?

記事No.83387 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83421  Re[18]: 巨大なテキストファイルを高速で出力する方法
□投稿者/ なちゃ -(2017/03/22(Wed) 15:29:53)
    > xmaxやymaxを大きくすると
    > 並列化処理が有効になるので、
    > GetBytesAndWriteASync5が高速になるのは予想できることですが
    > xmaxやymaxを固定したまま
    > zmaxを大きくしても
    > GetBytesAndWriteASync5が高速になるのはなぜなのでしょうか?

    高速になったというよりは、オーバーヘッドを相殺できるようになったということじゃないかと思います。
    処理時間が短すぎて、ライブラリのロードとかJITコンパイルによるオーバーヘッドが大きな割合を占めてしまっているというような意味です。
記事No.83387 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83442  Re[19]: 巨大なテキストファイルを高速で出力する方法
□投稿者/ バカボドン -(2017/03/23(Thu) 19:10:29)
    皆様どうも ありがとうございました

    非常に勉強になりました。

    ファイルサイズによって処理を使い分けるというのが
    ベストな方法だと実感しました。
記事No.83387 のレス / END /過去ログ142より / 関連記事表示
削除チェック/

■83674  巨大なバイナリファイルを高速で出力する方法
□投稿者/ バカボドン -(2017/04/01(Sat) 21:32:39)

    分類:[.NET 全般] 

    http://bbs.wankuma.com/index.cgi?mode=al2&namber=83387
    この質問ページで巨大なテキストファイルを高速で出力する方法を教えていただきました。

    次は、バイト配列から巨大なバイナリファイルを高速で出力したいと考えています。

    元となるコードは以下の物です。

    Dim a(xmax, ymax, zmax) As Byte


    Using stream As Stream = New FileStream(Path, FileMode.Create)
    Using writer As New BinaryWriter(stream)

    For z As Integer = 1 To zmax
    For y As Integer = 1 To ymax
    For x As Integer = 1 To xmax

    writer.Write(a(x, y, z))

    Next x
    Next y
    Next z

    End Using
    End Using


    これをどのようにすれば
    マルチスレッドを使って高速化することができますか?

    既にバイト化されているので、
    マルチスレッドを使ったとしても高速化するのは無茶でしょうか?



親記事 /過去ログ143より / 関連記事表示
削除チェック/

<前の20件

<< 0 | 1 >>

パスワード/

- Child Tree -