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

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

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

VBでCRC32を高速で計算する方法 [4]

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

■82462 / inTopicNo.81)  Re[43]: VBでCRC32を高速で計算する方法
  
□投稿者/ なちゃ (173回)-(2017/01/11(Wed) 12:12:26)
今のハードディスクだと100MB/sかもう少し上くらいの転送速度の物が多い気がするので、まあそのくらいでしょう。
SSDとかになると500MB/sを超えるような物もあったり、RAIDだと転送速度が上がったりするので、 一概に効果がある無いとは言えません。

また、こういう数値を計算するのが、ファイルを保存した後などであれば、キャッシュにのっていることが多い可能性もあります。
また、保存直後だとウィルススキャンがすでに裏で読み込んでいることもあります。

まあそれはそれとして、CRCとMd5などの暗号ハッシュでは、その生い立ちや目的や機能が全く違うので、一概にどうとは言えません。
CRCには誤り訂正機能もありますし。
ただまあ、CRCはどちらかというと低負荷でハードウェア回路で簡単に実現できるとか、昔は大きなメリットがありましたが、今時にソフトで扱うする分にはそれほど有利な点は無いとは思います。



引用返信 編集キー/
■82463 / inTopicNo.82)  Re[44]: VBでCRC32を高速で計算する方法
□投稿者/ なちゃ (174回)-(2017/01/11(Wed) 12:15:44)
メモリ使用量って何を見てますかね?
Window7以降?とかならタスクマネージャのパフォーマンスタブで、キャッシュ済みだったかで見れたような気がします。

メモリ使用量というのはかなり曖昧な表現なので、それだけでは何とも言えません。
引用返信 編集キー/
■82464 / inTopicNo.83)  Re[44]: VBでCRC32を高速で計算する方法
□投稿者/ なちゃ (175回)-(2017/01/11(Wed) 12:19:41)
ちなみにOSはできるだけメモリを有効活用しようとしますので、余分なメモリを使わずにほっとくことはあまりありません。
空きメモリがあればたいていそのうちキャッシュで埋まります。
そこから新たに大きなファイルを読んでも、例えばキャッシュが書き換わるだけでトータルの物理メモリ使用量は変わらなかったりします。

引用返信 編集キー/
■82467 / inTopicNo.84)  Re[45]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (61回)-(2017/01/11(Wed) 12:51:01)
ありがとうございます。

先ほど試したのは自宅のwin8 PCだったのですが
キャッシュという項目がありませんでした

いま、職場のwin7 PCで試したところ
キャッシュという項目があり、そこの値がファイルを読み込むことで変化することが分かりました。
 
引用返信 編集キー/
■82468 / inTopicNo.85)  Re[46]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (62回)-(2017/01/11(Wed) 12:54:50)
なちゃさん

あと、
このプログラムを作ろうと思った動機は
二つのHDDに同じファイルがあり、
それらのファイルがバイナリレベルで等価かどうかを確かめたいためです。

それぞれのHDDのファイルのハッシュを順番に求めて
比較すれば、目的を達成することができるます。

それで、いまHDDへのアクセス速度が律速しているわけなので
二つのファイルが別のHDDに置かれているのであれば
二つ同時にアクセスして、
二つ同時にハッシュを計算すれば計算効率が上がるはずです。

二つのファイルを並行してハッシュを計算するにはどのようにしたら良いでしょうか?




引用返信 編集キー/
■82470 / inTopicNo.86)  Re[47]: VBでCRC32を高速で計算する方法
□投稿者/ shu (953回)-(2017/01/11(Wed) 13:04:34)
No82468 (ぎゅんぎゅ さん) に返信
> なちゃさん
>
> あと、
> このプログラムを作ろうと思った動機は
> 二つのHDDに同じファイルがあり、
> それらのファイルがバイナリレベルで等価かどうかを確かめたいためです。
>
> それぞれのHDDのファイルのハッシュを順番に求めて
> 比較すれば、目的を達成することができるます。
>
スレの途中をあまり読んでいないので間違っているかもしれませんが
ファイル内の全バイトを読み込んでいるのなら2つのファイルから同バイト数づつ
読み込んで全バイトを比較すればよいのではないでしょうか?相違があった時点で
読込を継続する必要もなくなるのでは?
引用返信 編集キー/
■82471 / inTopicNo.87)  Re[47]: VBでCRC32を高速で計算する方法
□投稿者/ 魔界の仮面弁士 (1042回)-(2017/01/11(Wed) 13:04:58)
No82468 (ぎゅんぎゅ さん) に返信
> 二つのファイルを並行してハッシュを計算するにはどのようにしたら良いでしょうか?

スレッドを 2 つ用意し、それぞれで計算させてみては如何でしょう。
両方が終わったときの待ち合わせは必要ですが、それは Task.WaitAll などが使えるかと。



CRC32 の各実装ごとの処理効率のみを比較したいのであれば、
メモリを十分搭載した環境で、File.ReadAllBytes で一括読み込みした
As Byte() に対する算出時間を測定すれば、ひとまず
ディスクの読み取りキャッシュの差は除外できると思います。
CPU 側のキャッシュメモリは別として。
引用返信 編集キー/
■82472 / inTopicNo.88)  Re[48]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (63回)-(2017/01/11(Wed) 13:12:41)
魔界の仮面弁士さん

マルチスレッドを使わずにプログラムを書くと
計算中にフォームがフリーズしてしまいます。
そのため、既に計算全体をバックグラウンドで計算するようにしています。

そのバックグラウンドのスレッドから
更にもう一つバックグラウンドのスレッドを生成して
別のHDDのハッシュを同時並行で計算するということは可能なのでしょうか?
 
引用返信 編集キー/
■82473 / inTopicNo.89)  Re[49]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (64回)-(2017/01/11(Wed) 13:14:10)
魔界の仮面弁士さん

あと、マルチスレッドは
引数をもつことはできますが
返り値をもつことができませんが、
どのようにして計算してハッシュを元のスレッドに返せば良いですか?

パブリック変数を使うしかないですか?
 
引用返信 編集キー/
■82475 / inTopicNo.90)  Re[50]: VBでCRC32を高速で計算する方法
□投稿者/ 魔界の仮面弁士 (1043回)-(2017/01/11(Wed) 13:20:26)
No82473 (ぎゅんぎゅ さん) に返信
> 引数をもつことはできますが
> 返り値をもつことができませんが、
できますよ。BackgroudWorker なら e.Result に返却した上で、
依頼側は RunWorkerCompleted で受け取れますし、
Task なら Task(Of 戻り値型) として返却する形にして、
Result プロパティを使うなり、Await するなりすれば良いわけで。


> パブリック変数を使うしかないですか?
「他のスレッドが書き込んでいる間は、他のスレッドは読み書きしてはならない」ので、
変数を共有したら、同期制御が煩雑になりますよ。
排他制御用の仕組みはありますが、その分遅くなってしまいますし。
引用返信 編集キー/
■82479 / inTopicNo.91)  Re[51]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (65回)-(2017/01/11(Wed) 14:03:47)
魔界の仮面弁士 さん

ありがとうございます。

MultiProgram_run = New System.Threading.Thread( _
New System.Threading.ParameterizedThreadStart(AddressOf Program_run1xx))
MultiProgram_run.IsBackground = True

MultiProgram_run.Start()

というのでマルチスレッドを実行していますが
どのようにすれば返り値を取得することができますか?
 
引用返信 編集キー/
■82484 / inTopicNo.92)  Re[52]: VBでCRC32を高速で計算する方法
□投稿者/ 魔界の仮面弁士 (1046回)-(2017/01/11(Wed) 15:31:33)
No82479 (ぎゅんぎゅ さん) に返信
> というのでマルチスレッドを実行していますが
それは古い方式です。Task ベースに切り替えたほうが楽だと思いますよ。
http://bonk.red/articles/Microsoft/VB2015/Task.html
http://www.atmarkit.co.jp/fdotnet/chushin/masterasync_01/masterasync_01_02.html


> どのようにすれば返り値を取得することができますか?
元のコードを生かすなら、たとえばこんな感じでしょうか。

'=== 呼び出し側 ===
 param = New WorkerClass()
 param.FileName = fileName
 param.Crc32 = Nothing

 MultiProgram_run = New Thread(AddressOf Program_run1xx)
 MultiProgram_run.IsBackground = True
 MultiProgram_run.Start(param)


'=== 処理本体 ===
Sub Program_run1xx(ByVal o As Object)
  Dim arg = DirectCast(o, WorkerClass)
  Dim fileName = arg.FileName
  arg.Crc32 = ComputeCrc32(fileName)
End Sub



上記の他、デリゲートを使う手もあります。参考資料としてはこのあたり。
http://www.atmarkit.co.jp/ait/articles/0504/20/news111.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/434paramthread/paramthread.html
http://d.hatena.ne.jp/shunsuk/20070613/1181730536


調査対象のファイルが 2 つあるのなら、スレッドも 2 つ用意した上で、
結果の比較は「両方の算出が終わった後」で行うようにする必要がありますね。
引用返信 編集キー/
■82485 / inTopicNo.93)  Re[53]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (66回)-(2017/01/11(Wed) 16:11:03)
魔界の仮面弁士 さん

今まで使っていた方法が古い方式とは知りませんでした。
それでは新しいtaskの方式を使いたいと考えています。

教えてくださったwebページで戻り値の取得する方法は分かったのですが
引数の与え方が分かりませんでした。
どうすれば引数を使うことができますか?

Imports System.Threading
Imports System.Threading.Tasks

''' <summary>
''' タスクの実行結果を受け取るサンプル
''' </summary>
Module Module1
''' <summary>
''' メイン
''' </summary>
Sub Main()
' タスクを作成
Dim t = New Task(Of String)(AddressOf Func1)
' タスクを開始する。
t.Start()
' タスクの終了を待機する。
t.Wait()
'タスクの実行結果を表示する。
MsgBox(t.Result)
'Console.WriteLine("Done.")
#If DEBUG Then
' Console.ReadKey()
#End If
End Sub

''' <summary>
''' 値を返す関数型のタスクメソッド
''' </summary>
''' <returns>タスクの戻り値</returns>
Function Func1(ByVal ddd As Integer) As String
' Thread.Sleep(1000)
Return ddd * 2
End Function
End Module

引用返信 編集キー/
■82486 / inTopicNo.94)  Re[54]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (67回)-(2017/01/11(Wed) 16:56:25)

Dim t = New Task(Of String)(AddressOf Func1, ddd)


でいけました。
 
引用返信 編集キー/
■82497 / inTopicNo.95)  Re[55]: VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (68回)-(2017/01/11(Wed) 19:46:40)
教えてくださった方法で
並列化処理でのハッシュの取得がうまくいきました。

ありがとうございます。
 
引用返信 編集キー/

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

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

このトピックに書きこむ