2

この質問があまりにも「正しい分野」ではないことを願っています。スタックフローの多くの人々と比較して、私は初心者だと率直に言います...

取り組んでいる AI プロジェクトの画像、音声、テキストのオブジェクト表現を比較したいと考えています。3 つの入力すべてを 1 つのデータ型に変換し、中央の比較アルゴリズムを使用して静的に一致する可能性を判断したいと考えています。

このような比較を行うための「最速」のネイティブ .Net および SQL データ型は何ですか? .Net では、CLR で最も少ない量の変換を必要とするデータ型はどれですか? SQL の場合、最も速く「CRUD 処理」できるのはどの型ですか?

私は .Net のバイトと SQL の整数を考えていましたが、整数は 1 次元の概念であるという問題を引き起こします。画像と音声は、SQL ではなくファイル システム内で処理する必要があると思いますか...おそらくそうだと思います...</p>

FWIW TrossenRobotics.com で購入した部品からロボットを作成しています。

4

5 に答える 5

2

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

ハッシュが一致しない場合は、オブジェクトが一致していないことを確認できます(これはほとんどの場合です)。

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

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

于 2009-06-08T20:49:41.047 に答える
2

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

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

NTFS ディスクで圧縮を使用することについて誰かと話し合ったことがあることを思い出します。NTFS パーティションを圧縮すると、同じデータ ブロックを解凍するためにより多くの処理を行う必要があるにもかかわらず、読み取るデータ ブロックが大幅に減るため、実際にはコンピューターのパフォーマンスが向上することを証明できました。

パフォーマンスを改善するには、最も弱い (最も遅い) リンクを見つけて、そこから開始するだけです。最適化すると、別の弱いリンクができます...

于 2009-06-08T21:06:22.903 に答える
0

個人的には、バイト配列を使用するのが最善だと思います。ファイルをバッファに簡単に読み込むことができます...そしてバッファからバイト配列に読み込んで、比較を行うことができます。

于 2009-06-08T20:49:14.777 に答える
0

私が覚えている限り、パフォーマンスの点では、Int32型は.NETのより高速なデータ型の1つです。ただし、アプリケーションに最適かどうかはわかりません。

于 2009-06-08T20:50:24.260 に答える
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 を使用している場合、'image' データ型に行き詰まっています。

イメージまたは varbinary(MAX) はどちらもクライアント上の byte[] オブジェクトに適切にマップされますが、SQL Server 2008 を使用している場合は、データを FILESTREAM データ型 ( http://blogs.msdn. com/manisblog/archive/2007/10/21/filestream-data-type-sql-server-2008.aspx )。

于 2009-06-08T21:06:54.820 に答える