2009-06-08 11 views
2

...最速.NETとSQLデータ型

私が取り組んでいるAIプロジェクトの画像、音声、テキストのオブジェクト表現を比較することができます。私はすべての3つの入力を単一のデータ型に変換し、静的に可能性のあるマッチを決定するために中央比較アルゴリズムを使用したいと思います。

このような比較を行うための「最も速い」ネイティブ.NETデータ型とSQLデータ型は何ですか? .NETでは、CLRで最小限のコンバージョンを必要とするデータ型は何ですか? SQLの場合、「CRUD-ed」はどのタイプが最速ですか?

私はSQLのための.Netと整数のバイトを考えていましたが、整数は1次元の概念であるという問題を提起します。私は、私が個人的にTrossenRobotics.com

答えて

2

個人的には、大きなバイナリオブジェクトを頻繁に比較する必要がある場合は、オブジェクトをハッシュし、ハッシュを比較します。

ハッシュが一致しない場合は、オブジェクトが一致しないことを確認できます(これは大部分のケースに該当します)。

ハッシュが一致する場合は、実際のオブジェクトを比較するためのより長いルーチンを開始できます。

これらのオブジェクトを頻繁に比較している場合は、この方法だけでもパフォーマンスが大幅に向上します。

+0

良い点。私は、テキストが同一のマッチではあるが、オーディオとビデオはまれに(もしそうであれば)出てくると思う。私はハッシュが高価だと思っていますが、テキストを少なくして処理していきたいと思います。 – nbdeveloper

0

で買った部品からロボットを構築しています

FWIW ...私はそう推測している...あなたは画像や音声ではなく、SQLよりも、ファイルシステム内で処理する必要があると思いますかあなたがバイト配列を使うのが最善だと言います。ファイルをバッファーに読み込み、バッファーからバイト配列に読み込んで比較することができます。

+0

逆に、私はむしろint配列を使用します。つまりx86は32ビットワードを使用するため、2バイトを比較するには少なくとも2つの32ビット整数を比較するのと同じくらい多くの時間がかかります。私は "少なくとも" CPUはまだいくつかの時間がかかるパディングを行う必要があるため、言う。したがって、基本的に、int配列を使うことで、操作は少なくとも4倍高速になります。 –

0

私の知る限り、Int32型は、.NETの高速データ型の1つです。それがあなたのアプリケーションに最も適しているかどうかは言えません。

1

データタイプの速度は、測定するのが少し難しいです。 32ビットのオペレーティングシステムまたは64ビットを使用している場合、大きな違いがあります。どうして?これは、このデータを処理できる速度を決定するためです。 一般に、32ビットシステムでは、32ビット(int16、int32、char、byte、ポインタ)に収まるすべてのデータ型が同じ速度として処理されます。多くのデータを処理する必要がある場合は、CPUで処理するために4バイト単位で分割することをお勧めします。

しかし、ディスクにデータを書き込む場合、データの速度はより多くの要因に依存する傾向があります。ディスクデバイスがUSBポートに接続されている場合、すべてのデータがシリアル化されます。したがって、バイト単位でバイト単位になります。その場合、サイズはあまり重要ではありませんが、最小のデータブロックは最小のギャップを残します。 (Pascalのような言語では、ストリーミングのパフォーマンスを最適化するために、この種のデータを圧縮したレコードを使用し、レコードのフィールドを4バイトの倍数に揃えてCPUのパフォーマンスを調整します)。 通常のディスクはデータをより大きなブロックに格納します。読み書き速度を上げるには、データ構造を可能な限りコンパクトにすることをお勧めします。しかし、パフォーマンスを処理するために、4バイトの境界にそろえて配置する方が効果的です。

私はかつてNTFSディスクで圧縮を使用することについて誰かと話し合ったことを思い出させる。 NTFSパーティションを圧縮すると、実際には同じデータブロックを解凍するためにさらに処理する必要があったとしても、データブロックの読み込みが少なくて済み、実際にはコンピュータのパフォーマンスが向上することが証明されました。

パフォーマンスを向上させるには、最も弱い(最も遅い)リンクを見つけてそこから開始するだけです。最適化されたら、別の弱いリンクがあります。

0

.NETに何かをプルする前に、LEN機能を使用してSQL Serverのデータの長さをチェックする必要があります。長さが異なる場合は、すでに2つのオブジェクトが異なることがわかります。これにより、SQL Serverから不要なデータをクライアントアプリケーションにたくさん保存する必要がなくなります。

また、CHECKSUM関数(http://msdn.microsoft.com/en-us/library/aa258245(SQL.80).aspx)を使用して(バイナリデータとは別の列に)ハッシュコードを格納することをお勧めします。これは、SQL Server 2005以上を使用していて、データをvarbinary(MAX)として保存している場合にのみ機能します。もう一度、ハッシュコードが異なる場合、バイナリデータは確実に異なります。

SQL Server 2000を使用している場合、「イメージ」データ型が残っています。

イメージまたはvarbinary(MAX)の両方がクライアントのバイト[]オブジェクトにうまくマッピングされますが、SQL Server 2008を使用している場合は、データをFILESTREAMデータ型(http://blogs.msdn.com/manisblog/archive/2007/10/21/filestream-data-type-sql-server-2008.aspx)として保存することができます。

関連する問題