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

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

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

全過去ログを検索

<< 0 | 1 | 2 | 3 >>
■83328  Re[26]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ 金尾 -(2017/03/17(Fri) 12:03:55)
    もしかしてデータが読み込まれていないのではないかと思い
    読み込んだデータを出力してもみましたが
    両方とも正常に読み込むことができています。
     
記事No.83253 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83331  Re[26]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ むー -(2017/03/17(Fri) 12:14:07)
    No83327 (金尾 さん) に返信
    > 方法1
    > Dim bs00(CInt(file_size - 1)) As Byte
    > 
    > For i As Integer = 1 To filenum
    >     Dim fs As New FileStream(StrPath(i), FileMode.Open, FileAccess.Read)
    >     fs.Read(bs00, 0, file_size)
    >     fs.Close()
    > Next i
    > 
    > 方法2
    > Parallel.For(1, filenum, Sub(i)
    >         Dim bs0(CInt(file_size - 1)) As Byte
    >         Dim fs As New FileStream(StrPath(i), FileMode.Open, FileAccess.Read)
    > 
    >         SyncLock fs
    >             fs.Read(bs0, 0, file_size)
    >         End SyncLock
    > 
    >         fs.Close()
    >     End Sub)
    
    
    これらは同じではありませんよね
    方法2はロックオブジェクトを共有していないので
    排他がされていませんよ、複数のファイルが並行で読み取られてます
    
    なので
    ・SSDは並行で読み取ったら速くなる
    ・HDDは並行で読み取ったら遅くなる
    ということだと思います
記事No.83253 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83330  Re[27]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ なちゃ -(2017/03/17(Fri) 12:11:10)
    No83328 (金尾 さん) に返信
    > もしかしてデータが読み込まれていないのではないかと思い
    > 読み込んだデータを出力してもみましたが
    > 両方とも正常に読み込むことができています。

    単にシーケンシャルに処理を書いた場合、ファイル読み込みが終わってから次のリードでファイル転送を開始するまでに空きが入るため、SSDだとマックスの効率にならないとか(この理由だとブロッキングキュー使ったものでも同じ問題あるのでさらに工夫が必要)。
    HDDの場合、逆に同時オープンすることで物理シークが発生して効率悪化という可能性がありますが、同時オープンしてなくても変わらないという話もある感じなので何ともいえません。
    ディスク処理の最適化ってなかなか難しいです。
記事No.83253 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83332  Re[28]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ なちゃ -(2017/03/17(Fri) 12:16:48)
    あ、パラレルの方はスレッド使いすぎて、ファイル転送用のシステムスレッドが効率的に動けてないとかもあるかも、分かりませんが。
    Forのパラメータで最大並列数を適度に絞ってみた方が良いかもしれません。
記事No.83253 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83333  Re[27]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ なちゃ -(2017/03/17(Fri) 12:18:53)
    No83331 (むー さん) に返信
    > ■No83327 (金尾 さん) に返信
    >>方法1
    >>Dim bs00(CInt(file_size - 1)) As Byte
    >>
    >>For i As Integer = 1 To filenum
    >> Dim fs As New FileStream(StrPath(i), FileMode.Open, FileAccess.Read)
    >> fs.Read(bs00, 0, file_size)
    >> fs.Close()
    >>Next i
    >>
    >>方法2
    >>Parallel.For(1, filenum, Sub(i)
    >> Dim bs0(CInt(file_size - 1)) As Byte
    >> Dim fs As New FileStream(StrPath(i), FileMode.Open, FileAccess.Read)
    >>
    >> SyncLock fs
    >> fs.Read(bs0, 0, file_size)
    >> End SyncLock
    >>
    >> fs.Close()
    >> End Sub)
    >
    >
    > これらは同じではありませんよね
    > 方法2はロックオブジェクトを共有していないので
    > 排他がされていませんよ、複数のファイルが並行で読み取られてます
    >
    > なので
    > ・SSDは並行で読み取ったら速くなる
    > ・HDDは並行で読み取ったら遅くなる
    > ということだと思います

    あーほんとですね、これだとHDDで悪くなるのはいかにもありそうです(理由はつまり先に書いたのと同じ)。
記事No.83253 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83336  Re[28]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ 金尾 -(2017/03/17(Fri) 12:43:36)
    ありがとうございます。

    納得しました。
    そういうことでしたか。

    どうも、HDDとSSDで取得方法を変えた方が効率が良さそうです。

    指定したドライブがHDDかSSDかを調べたいのですが
    どのようなコードで調べることができますか?

    ざっと検索して調べてみたのですが
    分かりませんでしたので教えてください。
     
記事No.83253 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83339  Re[29]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ 魔界の仮面弁士 -(2017/03/17(Fri) 13:23:52)
    No83336 (金尾 さん) に返信
    > どうも、HDDとSSDで取得方法を変えた方が効率が良さそうです。

    やるとしても、HDD か SSD かではなく、「SSD かどうか」の判定の方が良いかも。

    それ以外のケース、たとえばネットワークドライブや
    ソフトウェアRAIDなど、判定できないケースもあるでしょうし。


    > 指定したドライブがHDDかSSDかを調べたいのですが
    > どのようなコードで調べることができますか?
    この手の判断なら、WMI の出番でしょうね。

    Windows 8 以降なら、MSFT_PhysicalDisk クラスの
    MediaType プロパティ(3=HDD,4=SSD,5=SCM,0=Unspecified)で判断できます。
    USB 接続タイプのものだと、SSD/HDD共に 0 が返されることもありますので、
    その場合は SpindleSpeed プロパティでディスクの回転数も確認してみて下さい。
    SSD なら 0 が返ります。(回転数情報が無い場合は UInt32.MaxValue)

    https://msdn.microsoft.com/en-us/library/hh830532.aspx
記事No.83253 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83337  Re[29]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ 774RR -(2017/03/17(Fri) 13:11:39)
    質問内容が変わってきたらスレッドを更新してくれると読者が楽できるような気がする。

    WMI で取れるはず。回転速度が 0rpm だったら SSD
    http://8thway.blogspot.jp/2014/04/wmi-ssd.html

    # ネットワークディスクのときどうすんだろ?
記事No.83253 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83338  Re[26]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ PANG2 -(2017/03/17(Fri) 13:18:04)
    2017/03/17(Fri) 13:31:51 編集(投稿者)

    No83327 (金尾 さん) に返信
    > やっていることは同じなのに
    > なぜかSSDとHDDで方法によってここまで速度差が見られるのはなぜなのでしょうか?

    ファイル読込がボトルネックでしたっけ?
    振り出しに戻って、まずはシングルスレッドで計測してボトルネックを見つけて下さい。

    --
    Sub Main()
    Dim sw1 As New Stopwatch
    Dim sw2 As New Stopwatch
    Dim sw3 As New Stopwatch
    Dim sw4 As New Stopwatch

    For i As Integer = 1 To 10000
    sw1.Start()
    '@メモリ確保
    Dim bs(100 * 1024 * 1024 - 1) As Byte
    sw1.Stop()

    sw2.Start()
    'Aファイル読み込み
    sw2.Stop()

    sw3.Start()
    'Bbyte配列を文字列配列へ変換
    sw3.Stop()

    sw4.Start()
    'Cデータをまとめるための処理
    sw4.Stop()
    Next
    Console.WriteLine(sw1.ElapsedMilliseconds)
    Console.WriteLine(sw2.ElapsedMilliseconds)
    Console.WriteLine(sw3.ElapsedMilliseconds)
    Console.WriteLine(sw4.ElapsedMilliseconds)
    End Sub
記事No.83253 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83340  Re[27]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ 魔界の仮面弁士 -(2017/03/17(Fri) 13:30:27)
    No83338 (PANG2 さん) に返信
    > ファイル読込がボトルネックでしたっけ?
    > まずはシングルスレッドで計測してボトルネックを見つけて下さい。

    自分も、ボトルネックの再計測が必要という案に一票。

    それと、ファイルによって処理時間が異なるでしょうから、
    各区間ごとの累計時間だけでなく、各回の最短時間/最長秒数/平均時間も
    区間ごとに集計しておいた方が良いかと思います。
記事No.83253 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83345  Re[28]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ 金尾 -(2017/03/18(Sat) 17:23:25)
    ほぼ全ての問題が解決しました
    みなさまどうもありがとうございました。
     
記事No.83253 のレス / END /過去ログ142より / 関連記事表示
削除チェック/

■95253  Re[7]: 任意の時にバルーンヒントを表示するには
□投稿者/ NNN -(2020/07/04(Sat) 12:15:36)
    ありがとうございます。

    > 自己生成した場合は、Dispose 漏れを防ぐために IContainer への登録も忘れずに。


    > If Me.components Is Nothing Then
    >  Me.components = New System.ComponentModel.Container()
    > End If
    > Dim tt As New ToolTip(Me.components) With {.IsBalloon = True}

    ここがよく分かっていないのですが
    このコードを書くとプログラム終了時に自動的にDisposeされるという意味ですか?
    上記のコードはどこに書けば良いですか?

    Sub Form1_Load ですか?


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

■101881  Re[1]: web文字の修飾表現?
□投稿者/ Hongliang -(2023/05/05(Fri) 11:27:15)
    ほかの可能性もありますが、LaTeXにおける下線(bar under the letter)かなと思います。
    https://takataninote.com/tex/accent.html
    # アクセント記号にジャンル分けされてるけど下線で表現する言語ってあるのかしら…上線ならマクロンがあるけど。
    ちなみに強調とかに使用される下線は \underline{...} なので別物です。
記事No.101880 のレス /過去ログ177より / 関連記事表示
削除チェック/

<前の20件

<< 0 | 1 | 2 | 3 >>

パスワード/

- Child Tree -