2009-06-08 4 views
2

Ich hoffe, dass diese Frage nicht zu „richtig Feld“ und ich werde ein newb sagt ich bin im Vergleich zu vielen Menschen auf stackflow ...Schnellste .Net und SQL-Datentypen

Ich möchte im Voraus sein um Objektdarstellungen von Bildern, Audio und Text für ein AI-Projekt, an dem ich arbeite, zu vergleichen. Ich möchte alle drei Eingaben in einen einzigen Datentyp konvertieren und einen zentralen Vergleichsalgorithmus verwenden, um statisch wahrscheinliche Übereinstimmungen zu bestimmen.

Was sind die "schnellsten" nativen .NET- und SQL-Datentypen für solche Vergleiche? In .Net welcher Datentyp benötigt am wenigsten Konvertierungen in der CLR? Welcher Typ kann für SQL am schnellsten "CRUD-ed" sein?

Ich dachte Bytes für .NET und ganze Zahlen für SQL, aber ganze Zahlen stellen ein Problem eines eindimensionalen Konzepts. Glauben Sie, die Bilder und Audio sollte anstatt SQL innerhalb des Dateisystems behandelt werden ... ich so vermute ich ...

FWIW Ich bin ein Roboter aus Teilen Gebäude I auf TrossenRobotics.com

Antwort

2

Persönlich, wenn Sie häufige Vergleiche zwischen großen binären Objekten durchführen müssen, würde ich die Objekte Hash und die Hashes vergleichen.

Wenn die Hashes nicht übereinstimmen, können Sie sicher sein, dass die Objekte nicht übereinstimmen (was in der Mehrzahl der Fälle der Fall sein sollte).

Wenn die Hashes übereinstimmen, können Sie eine längere Routine starten, um die tatsächlichen Objekte zu vergleichen.

Diese Methode sollte Ihre Leistung erheblich steigern, wenn Sie diese Objekte häufig vergleichen.

+0

Guter Punkt. Ich würde erwarten, dass der Text mit identischen Übereinstimmungen, aber selten (wenn überhaupt) mit Audio und Video aufwartet. Ich denke, Hashing ist teuer, aber ich würde weniger Text verarbeiten, ich werde das hinzufügen. – nbdeveloper

0

persönlich gekauft, ich Ich würde sagen, du bist am besten mit einem Byte-Array. Sie können die Datei einfach in den Puffer lesen ... und aus dem Puffer in das Byte-Array, wo Sie den Vergleich durchführen können.

+0

Im Gegensatz dazu würde ich lieber ein int-Array verwenden - das x86 verwendet 32-Bit-Wörter, so dass der Vergleich von zwei Bytes mindestens so oft dauert wie der Vergleich zweier 32-Bit-Ganzzahlen. Ich sage "zumindest", weil die CPU noch das Padding machen muss, was auch etwas Zeit in Anspruch nimmt. Im Grunde genommen würde die Operation bei Verwendung eines int-Arrays mindestens viermal schneller werden. –

0

Soweit ich mich erinnere, gehört der Int32-Typ zu den schnelleren Datentypen von .NET. Ich kann nicht sagen, ob es in Ihrer Anwendung am besten geeignet ist.

1

Geschwindigkeit der Datentypen ist ein bisschen schwer zu messen. Es macht einen großen Unterschied, wenn Sie ein 32-Bit-Betriebssystem oder ein 64-Bit-Betriebssystem verwenden. Warum? Weil es die Geschwindigkeit bestimmt, mit der diese Daten verarbeitet werden können. Im Allgemeinen werden bei einem 32-Bit-System alle Datentypen, die in 32 Bits passen (int16, int32, char, byte, pointer), mit der gleichen Geschwindigkeit verarbeitet. Wenn Sie viele Daten für die Verarbeitung benötigen, teilen Sie sie am besten in Blöcke von jeweils vier Bytes auf, damit Ihre CPU sie verarbeiten kann.

Wenn Sie jedoch Daten auf Festplatte schreiben, hängt die Datengeschwindigkeit von vielen Faktoren ab. Wenn sich Ihr Festplattenlaufwerk an einem USB-Anschluss befindet, werden alle Daten serialisiert, also Byte für Byte. In diesem Fall spielt Größe keine Rolle, obwohl die kleinsten Datenblöcke die kleinsten Lücken hinterlassen würden. (In Sprachen wie Pascal würden Sie einen gepackten Datensatz für diese Art von Daten verwenden, um die Streaming-Leistung zu optimieren, während Ihre Felder in Ihren Datensätzen für die CPU-Leistung auf ein Vielfaches von 4 Byte ausgerichtet sind.) Regelmäßige Platten speichern Daten in größeren Blöcken. Um die Lese-/Schreibgeschwindigkeit zu erhöhen, möchten Sie Ihre Datenstrukturen so kompakt wie möglich gestalten. Aber für die Verarbeitungsleistung ist es effektiver, sie auf 4-Byte-Grenzen auszurichten.

Das erinnert mich, dass ich einmal eine Diskussion mit jemandem über die Verwendung von Komprimierung auf einer NTFS-Festplatte hatte. Ich konnte beweisen, dass das Komprimieren einer NTFS-Partition tatsächlich die Leistung eines Computers verbessern kann, da es wesentlich weniger Datenblöcke lesen musste, obwohl es mehr Verarbeitungsschritte zur Dekomprimierung derselben Datenblöcke benötigte.

Um die Leistung zu verbessern, müssen Sie nur den schwächsten (langsamsten) Link finden und dort beginnen. Sobald es optimiert ist, wird es einen weiteren schwachen Link geben ...

0

Bevor Sie etwas in .NET ziehen, sollten Sie die Länge der Daten in SQL Server mit der LEN-Funktion überprüfen. Wenn die Länge unterschiedlich ist, wissen Sie bereits, dass die beiden Objekte unterschiedlich sind. Dadurch sollten Sie viele unnötige Daten von SQL Server in Ihre Client-Anwendung herunterbringen.

Ich würde auch empfehlen, einen Hash-Code (in einer separaten Spalte von den Binärdaten) mit der CHECKSUM-Funktion (http://msdn.microsoft.com/en-us/library/aa258245(SQL.80).aspx) zu speichern. Dies funktioniert nur, wenn Sie SQL Server 2005 und höher verwenden und Ihre Daten als varbinary (MAX) speichern. Auch wenn die Hash-Codes unterschiedlich sind, sind die Binärdaten definitiv anders.

Wenn Sie SQL Server 2000 verwenden, stecken Sie den Datentyp 'Bild' fest.

Sowohl image als auch varbinary (MAX) werden gut auf byte [] -Objekte auf dem Client abgebildet. Wenn Sie jedoch SQL Server 2008 verwenden, können Sie Ihre Daten als FILESTREAM-Datentyp speichern (http://blogs.msdn.com/manisblog/archive/2007/10/21/filestream-data-type-sql-server-2008.aspx).