我希望这个问题不是太“正确”,我会坦率地说,与 stackflow 上的许多人相比,我是一个新手......

我想比较我正在从事的人工智能项目的图像、音频和文本的对象表示。我想将所有三个输入转换为单一数据类型,并使用中央比较算法来确定静态可能的匹配。

用于进行此类比较的“最快”本机 .Net 和 SQL 数据类型是什么?在 .Net 中,什么数据类型在 CLR 中需要最少的转换?对于SQL来说,什么类型的增删改查速度最快?

我考虑的是 .Net 的字节和 SQL 的整数,但整数作为一维概念存在问题。你认为图像和音频应该在文件系统而不是 SQL 中处理吗?我猜是这样的……

FWIW 我正在用在 TrossenRobotics.com 购买的零件建造一个机器人

有帮助吗?

解决方案

个人而言,如果你需要做大量的二进制对象之间频繁的比较,我想哈希的对象和比较哈希值。

如果散列不匹配,那么你可以肯定的对象不匹配(这应该是大多数的情况下)。

如果哈希值不匹配,你就可以启动一个较为漫长的程序来比较实际的对象。

仅此方法,如果你经常比较这些对象应该提高你的表现颇有几分。

其他提示

数据类型的速度是有点难以测量。它使一个很大的区别,如果您使用的是32位操作系统或64位。为什么?因为它决定在该数据可被处理的速度。 通常,32位的系统上,适合内部32位(INT16,INT32,炭,字节,指针)的所有数据类型将被处理为相同的速度。如果您需要大量待处理的数据,最好把它划分为每个四个字节块为CPU进行处理。

但是,当你将数据写入磁盘,数据的速度往往取决于很多的因素较多。如果你的磁盘设备是一些USB端口上,所有数据被序列化,因此这将是一个字节一个字节后。在这种情况下,大小并不重要了,虽然最小的数据块会留下最小的差距。 (在例如Pascal语言中,您会使用一个包装记录这种数据,以优化流性能,而在你的记录在4个字节的CPU性能倍数对准你的领域。) 普通磁盘将在更大的块数据存储。为了提高读/写速度,你更愿意让你的数据结构尽可能紧凑。但用于处理性能,它们具有4个字节的边界上对齐是更有效的。

这倒提醒了我,我曾经与某人使用NTFS磁盘上的压缩的讨论。我设法证明,压缩NTFS分区实际上可以提高计算机的性能,因为它不得不读少了很多的数据块,即使这意味着它必须做更多的处理,以解压缩相同的数据块。

要提高性能,你只需要找到最弱(最慢)的链接,并从那里开始。一旦它的优化,就会有另一个薄弱环节......

就个人而言,我会说你最好使用一个字节数组。您可以轻松地读取文件中的缓冲......从缓冲区中的字节数组,你可以做比较。

据我记得,在纯粹的性能方面,的Int32类型是更快的数据类型的.NET之中。不能说是否是最适合不过在你的应用程序。

在将任何内容拉入 .NET 之前,您应该使用 LEN 函数检查 SQL Server 中数据的长度。如果长度不同,您就已经知道这两个对象是不同的。这应该可以避免将大量不必要的数据从 SQL Server 传输到客户端应用程序。

我还建议使用 CHECKSUM 函数存储哈希码(在与二进制数据不同的列中)(http://msdn.microsoft.com/en-us/library/aa258245(SQL.80).aspx)。仅当您使用 SQL Server 2005 及更高版本并且将数据存储为 varbinary(MAX) 时,此方法才有效。再次强调,如果哈希码不同,则二进制数据肯定不同。

如果您使用的是 SQL Server 2000,则您将不得不使用“image”数据类型。

image 或 varbinary(MAX) 都可以很好地映射到客户端上的 byte[] 对象,但是如果您使用的是 SQL Server 2008,则可以选择将数据存储为 FILESTREAM 数据类型(http://blogs.msdn.com/manisblog/archive/2007/10/21/filestream-data-type-sql-server-2008.aspx).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top