Frage

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

werde im Voraus

Ich mag Objektdarstellungen von Bildern, Audio und Text für ein AI-Projekt vergleichen arbeite ich an. Ich möchte alle drei Eingänge zu einem einzigen Datentyp konvertieren und einen zentralen Vergleichsalgorithmus, um zu bestimmen statisch wahrscheinliche Übereinstimmungen verwenden.

Was sind die „schnellsten“ native .NET und SQL-Datentypen für Vergleiche wie diese zu machen? In .Net welcher Datentyp erfordert die geringste Menge an Conversions in der CLR? Für SQL, welche Art können „CRUD-ed“ der schnellste sein?

Ich war Bytes für .Net und ganze Zahlen für SQL denkt, sondern ganze Zahlen stellen ein Problem von einem eindimensionales Konzept zu sein. Glauben Sie, dass die Bilder und Audio sollte anstatt SQL innerhalb des Dateisystems behandelt werden ... Ich vermute, so ...

FWIW Ich baue einen Roboter aus den Teilen I bei TrossenRobotics.com gekauft

War es hilfreich?

Lösung

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

Wenn die Hashes nicht übereinstimmen, dann können Sie sicher sein, die Objekte nicht übereinstimmen (was die Mehrheit der Fälle sein sollte).

Wenn die Hashes übereinstimmen, können Sie dann eine langwierige Routine beginnen die eigentlichen Objekte zu vergleichen.

Diese Methode allein sollte Ihre Leistung einiges steigern, wenn Sie diese Objekte häufig sind verglichen wird.

Andere Tipps

Die Geschwindigkeit der Datentypen ist ein bisschen schwer zu messen. Es macht einen großen Unterschied, wenn Sie ein 32-Bit-Betriebssystem oder einen 64-Bit verwenden. Warum? Weil es bestimmt die Geschwindigkeit, mit der diese Daten verarbeitet werden können. Im allgemeinen wird auf einem 32-Bit-System, alle Datentypen, die in 32 Bits passen (int16, int32, char, byte, Zeiger) werden als die gleiche Geschwindigkeit verarbeitet werden. Wenn Sie viele Daten verarbeitet werden müssen, ist es am besten, es in Blöcken von vier Bytes je für Ihre CPU zu teilen, sie zu verarbeiten.

Wenn Sie jedoch Daten auf die Festplatte schreiben, Datengeschwindigkeit neigt dazu, viel mehr Faktoren abhängig zu sein. Wenn Ihr Plattengerät auf einige USB-Port ist, erhält alle Daten serialisiert, so wäre es Byte für Byte sein. In diesem Fall egal Größe nicht viel, obwohl die kleinsten Datenblöcke die kleinsten Lücken lassen würde. (In Sprachen wie Pascal würden Sie einen gepackten Datensatz für diese Art von Daten verwenden, um die Leistung zu optimieren Streaming, während in Ihre Aufzeichnungen Ihre Felder mit ausgerichtet auf ein Vielfaches von 4 Bytes für die CPU-Leistung.) Regelmäßige Datenträger speichern Daten in größeren Blöcken. Um Lese- / Schreibgeschwindigkeit zu erhöhen, würden Sie es vorziehen, Ihre Datenstrukturen so kompakt wie möglich zu machen. Aber für die Leistung der Verarbeitung zu haben ist sie ausgerichtet auf 4 Byte Grenzen effektiver zu gestalten.

Was mir daran erinnert, dass ich einmal ein Gespräch mit jemandem über die Verwendung von Kompression auf einem NTFS-Datenträger hatte. Es gelang mir, zu beweisen, dass eine NTFS-Partition komprimieren tatsächlich die Leistung eines Computers verbessern könnte, da es viel weniger Datenblöcke zu lesen hatte, obwohl es bedeutete, es musste mehr Verarbeitungs tun die gleichen Datenblöcke zu dekomprimieren.

Zur Verbesserung der Leistung, müssen Sie nur dort die schwächste (langsamsten) Link und beginnen zu finden. Sobald es optimiert ist, wird es ein weiteres schwaches Glied sein ...

Persönlich würde ich sagen, dass Sie am besten sind ein Byte-Array aus verwenden. Sie können ganz einfach die Datei in den Puffer gelesen ... und aus dem Puffer in den Byte-Array, in dem Sie den Vergleich tun können.

Soweit ich mich erinnere, in Bezug auf die schiere Leistung, die Int32-Typ unter den schnelleren Datentypen von .NET ist. Kann nicht sagen, ob es das am besten geeignete in der Anwendung ist aber.

Vor allem in .NET ziehen, sollten Sie die Länge der Daten in SQL Server überprüfen Sie die LEN-Funktion. Wenn die Länge unterschiedlich ist, wissen Sie bereits, dass die beiden Objekte unterschiedlich sind. Dies sollte viele unnötigen Daten von SQL Server auf dem Client-Anwendung speichern abschalten zu müssen.

I würde auch einen Hash-Code empfehlen Speicher (in einer gesonderten Spalte von den binären Daten) unter Verwendung der Prüfsummenfunktion ( http://msdn.microsoft.com/en-us/library/aa258245 (SQL.80) aspx ). Dies funktioniert nur, wenn Sie SQL Server 2005 verwenden und oben und Sie speichern Ihre Daten als varbinary (MAX). Noch einmal, wenn der Hash-Codes unterschiedlich ist, die binären Daten sind auf jeden Fall anders.

Wenn Sie SQL Server 2000 verwenden, werden Sie mit dem ‚Bild‘ Datentyp fest.

Sowohl Bild oder varbinary (MAX) schön auf dem Client [] Objekte auf Byte abbildet, aber wenn Sie SQL Server 2008 verwenden, haben Sie die Möglichkeit, Ihre Daten als ein Filestream-Datentyp ( http://blogs.msdn.com /manisblog/archive/2007/10/21/filestream-data-type-sql-server-2008.aspx ).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top