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

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

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

大量のテキストファイルをマルチスレッドで高速に読み込む方法 [3]

[トピック内 69 記事 (61 - 69 表示)]  << 0 | 1 | 2 | 3 >>

■83331 / inTopicNo.61)  Re[26]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
  
□投稿者/ むー (1回)-(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は並行で読み取ったら遅くなる
ということだと思います

引用返信 編集キー/
■83332 / inTopicNo.62)  Re[28]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ なちゃ (191回)-(2017/03/17(Fri) 12:16:48)
あ、パラレルの方はスレッド使いすぎて、ファイル転送用のシステムスレッドが効率的に動けてないとかもあるかも、分かりませんが。
Forのパラメータで最大並列数を適度に絞ってみた方が良いかもしれません。
引用返信 編集キー/
■83333 / inTopicNo.63)  Re[27]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ なちゃ (192回)-(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で悪くなるのはいかにもありそうです(理由はつまり先に書いたのと同じ)。
引用返信 編集キー/
■83336 / inTopicNo.64)  Re[28]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ 金尾 (37回)-(2017/03/17(Fri) 12:43:36)
ありがとうございます。

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

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

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

ざっと検索して調べてみたのですが
分かりませんでしたので教えてください。
 
引用返信 編集キー/
■83337 / inTopicNo.65)  Re[29]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ 774RR (489回)-(2017/03/17(Fri) 13:11:39)
質問内容が変わってきたらスレッドを更新してくれると読者が楽できるような気がする。

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

# ネットワークディスクのときどうすんだろ?

引用返信 編集キー/
■83338 / inTopicNo.66)  Re[26]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ PANG2 (164回)-(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

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

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

それと、ファイルによって処理時間が異なるでしょうから、
各区間ごとの累計時間だけでなく、各回の最短時間/最長秒数/平均時間も
区間ごとに集計しておいた方が良いかと思います。
引用返信 編集キー/
■83345 / inTopicNo.69)  Re[28]: 大量のテキストファイルをマルチスレッドで高速に読み込む方法
□投稿者/ 金尾 (38回)-(2017/03/18(Sat) 17:23:25)
ほぼ全ての問題が解決しました
みなさまどうもありがとうございました。
 
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示

<前の20件
トピック内ページ移動 / << 0 | 1 | 2 | 3 >>

このトピックに書きこむ